當我們在實際開發的過程中,經常會用到new這個關鍵字,需要用到什麼類,就new什麼類,非常的方便,但是我們在享受這種便利的同時,這種便利也給我們帶來了一些麻煩:
於是我們引入了簡單工廠來解耦
先假設以下情景,假如你有一家飲品店,使用者要自己點飲料
我們先看看如果不用工廠模式我們該怎麼實現這個需求,下面寫一段偽**:
public
class beveragestore
}
我們可以看到,依賴關係之間寫死在了**裡面,如果想要增加新的產品,必須去修改源**,這不符合開閉原則
我們來看看簡單工廠是如何做的
先看看類圖:
看看**:
beverage
public
class beverage
public
void
prepare()
public
void
brew()
public
void
stir()
public
void
pack()
@override
public string tostring()
return display.tostring();}}
coffee
public
class
coffee
extends
beverage
}
milkytea
public
class
milkytea
extends
beverage
}
******beveragefactory
public
class ******beveragefactory
}
beveragestore
public
class beveragestore
public beverage order(string type)
}
寫個測試方法
public
static
void
main(string args)
結果:準備:咖啡
加水:咖啡
攪拌:咖啡
打包:咖啡
---- 咖啡 ----
純淨水咖啡粉
糖
我們可以看到,其實簡單工廠所做的只是把原先產品和商店之間的依賴轉移到了產品和工廠,也不符合開閉原則,因為你要增加新的產品,你雖然不需要去修改商店了,但是還是要去修改工廠。當然,在規模很小的時候,簡單工廠也夠用了。
隨著我們規模的擴大,我們開了不少連鎖店,我們發現,在有些地方我們銷量並不理想,於是針對不同地方人的口味進行產品的調整勢在必行,但是簡單工廠已經不能滿足我們的生產需求了(產品種類越來越多,集中在乙個工廠裡面每次增加產品都要修改源**),於是我們引入了工廠方法。
先來看看類圖:
我們針對不同地區的人的口味對產品做了微調,使其更符合不同地區人的口味,不同地區的人,只要找到對應的店就行了,他們不用關心其它地方的產品,本地的店也能更加專注於對本地人的服務。
我們來看看**
beverage
public
class beverage
public
void
prepare()
public
void
brew()
public
void
stir()
public
void
pack()
@override
public string tostring()
return display.tostring();}}
guangximilkytea
public
guangximilkytea()
guangxicoffee
public
class
guangxicoffee
extends
beverage
}
hunancoffee
public
class
hunancoffee
extends
beverage
}
hunanmilkytea
public
class
hunanmilkytea
extends
beverage
}
beveragestore
public
abstract
class beveragestore
}
hunanstore
public
class
hunanstore
extends
beveragestore
}
guangxistore
public class
guangxistore
extends
beveragestore
}
我們來寫個測試方法
public
static
void
main(string args)
執行結果:
準備:湖南奶茶
加水:湖南奶茶
攪拌:湖南奶茶
打包:湖南奶茶
---- 湖南奶茶 ----
湖南純淨水
湖南奶粉
湖南香料
我們看看工廠方法做了什麼?
他其實是把乙個混合的工廠拆分成了多個更加專一的多個工廠
父類工廠規範了製作流程,子類工廠去完成具體實現
我們來看看這樣對比簡單工廠有何好處:
1. 假如湖南店要增加乙個產品,那麼用簡單工廠去做的話,要修改整個混合工廠,出錯會導致所有連鎖店癱瘓,而工廠方法則只需要修改湖南店的**,風險控制在了湖南店,出錯只會影響到湖南店
2. 假如我們要開發湖北地區的特殊產品,如果用簡單工廠,風險在所有連鎖店上,如果我們用工廠方法,則新建乙個湖北商店就行,對現有的系統沒有什麼影響
相信大家看到這裡對簡單工廠和工廠方法已經有了乙個比較深的理解了
因為抽象工廠相對來說比較複雜,所以我把抽象工廠單獨抽出來講
ps:原始碼位址
簡單工廠和工廠方法
這學期開始開設設計模式這門課,剛開始一直理解不了什麼是簡單工廠什麼是工廠方法,就在自己敲完 後頓悟!工廠方式不在工廠類中進行邏輯判斷,程式可以為不同產品類提供不同的工廠,不同的工廠類和產不同的產品。當使用工廠方法設計模式時,物件呼叫者需要與具體的工廠類耦合 下面來看看兩者的直觀區別 簡單工廠 工廠方...
簡單工廠方法,工廠方法,抽象工廠方法
以大話設計模式計算器為例 簡單工廠方法是由具體執行功能類,工廠類,客戶端構成,工廠類有case語句,負責建立不同的類,客戶端呼叫工廠類裡面的工廠方法,工廠類的工廠方法根據客戶端傳進去的引數new相應的類的物件返回給客戶端,客戶端得到返回的物件用該物件初始化該物件的成員變數最後呼叫該物件的方法執行計算...
工廠模式 簡單工廠和工廠方法
核心概念 實現了建立者和呼叫者分離 詳細分類 簡單 靜態工廠模式 工廠方法模式 抽象工廠模式 1.靜態工廠模式 public class ca ctory else if car.equals 特斯拉 else 方法2 每增加乙個類都要修改 不利於復用和維護 2.工廠方法模式 每個類分別實現ca c...