工廠方法模式
是為了彌補簡單工廠模式
的不足並且繼承它的優點而延生出的一種設計模式,它能更好的符合開閉原則的要求。
工廠方法模式,又稱工廠模式、多型工廠模式和虛擬構造器模式,通過定義工廠父類負責定義建立物件的公共介面,而子類則負責生成具體的物件。
發現簡單工廠模式存在一系列問題:
工廠類集中了所有例項(產品)的建立邏輯,一旦這個工廠不能正常工作,整個系統都會受到影響;
違背「開放 - 關閉原則」,一旦新增新產品就不得不修改工廠類的邏輯,這樣就會造成工廠邏輯過於複雜。
大眾汽車公司想必大家都不陌生,它旗下也有不少汽車品牌。大眾汽車公司就好比乙個汽車工廠,負責生產和銷售汽車。它可以為客戶提供乙個客戶需要的汽車。但是,如果客戶需要的汽車大眾公司目前還沒有,但是公司想要盈利,就必須為此而設計汽車,在這種情況下,大眾公司就要新新增一種汽車,同時要修改公司內部的生產環境(也就是工廠類的**)。這就是簡單工廠模式的運**況。簡單而言,就是工廠類(汽車公司)什麼都要幹,要修改必須大動干戈。因而一定程度上違背了開閉原則。而工廠方法模式則不一樣,大眾汽車公司不在總公司生產汽車,而是成立分公司,收購別的公司,成立具有針對性的汽車工廠專門生產對應的汽車。若客戶的大量需求得不到滿足,則總公司就另外成立新的二級公司(新品牌汽車的工廠)生產汽車,從而在不修改具體工廠的情況下引進新的產品。正如大眾集團的收購一樣。以下為簡單工廠模式和工廠方法模式的區別:
如果使用簡單工廠
是這樣的模式
如果使用工廠方法
是這樣的模式
組成(角色)
關係作用
抽象產品(product)
具體產品的父類
描述具體產品的公共介面
具體產品(concrete product)
抽象產品的子類;工廠類建立的目標類
描述生產的具體產品
抽象工廠(creator)
具體工廠的父類
描述具體工廠的公共介面
具體工廠(concrete creator)
抽象工廠的子類;被外界呼叫
描述具體工廠;實現factorymethod工廠方法建立產品的例項
手機專賣店store
賣手機,目前store
賣有兩種手機,乙個蘋果手機,乙個索尼手機,此時如果想從手機工廠進貨「小公尺」手機,那麼手機總工廠就必須修改內部實現
簡單工廠模式由******phonefactory,集中獲取不同的手機例項物件。
工廠方法模式由phonefactory的兩個實現,分別獲取不同的手機例項物件。
步驟1: 建立抽象產品類 ,定義具體產品的公共抽象介面;
public
abstract
class
phone
public
void
setbrand
(string brand)
public string getos()
public
void
setos
(string os)
}
步驟2: 建立抽象工廠類,定義具體工廠的公共介面
public
inte***ce
phonefactory
步驟3:建立具體工廠類(繼承抽象工廠類),定義建立對應具體產品例項的方法;
// 蘋果手機工廠
public
class
implements
phonefactory
}// 索尼手機工廠
public
class
sonyphonefactory
implements
phonefactory
}// 更多其他手機工廠。。。
步驟4: 建立具體產品類(繼承抽象產品類), 定義生產的具體產品;
// 蘋果手機
public
class
extends
phone
}// 索尼手機
public
class
sonyphone
extends
phone
}
步驟5:外界通過呼叫具體工廠類的方法,從而建立不同具體產品類的例項
// 手機專賣店
public
class
storeb
/** * 補充手機
*/public
void
supplyphone()
public
static
void
main
(string[
] args)
}
結果:
補充sony手機完成
優點:
缺點:總結:工廠模式可以說是簡單工廠模式的進一步抽象和拓展,在保留了簡單工廠的封裝優點的同時,讓擴充套件變得簡單,讓繼承變得可行,增加了多型性的體現。
原始碼:設計模式
其他設計模式介紹:設計模式-工廠方法模式
設計模式-抽象工廠模式
設計模式-建造者模式
設計模式 工廠方法模式
一 工廠方法 factory method 模式 工廠方法模式的意義是定義乙個建立產品物件的工廠介面,將實際建立工作推遲到工廠子類當中。核心工廠類不再負責產品的建立,這樣核心類成為乙個抽象工廠角色,僅負責具體工廠子類必須實現的介面,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角...
設計模式 工廠方法模式
1 factorymethod.h ifndef factorymethod h define factorymethod h include include using namespace std class osproduct 產品,product,產品的抽象類 class windowspro...
設計模式 工廠方法模式
框架的基礎知識 對框架的理解 框架和設計模式的關係 工廠方法模式 定義 定義乙個用於建立物件的介面,讓子類決定例項化哪乙個類,factory method使乙個類的例項化延遲到其子類。結構 產品 public inte ce product 具體產品 public class productimpl...