簡(jiǎn)單工廠模式
簡(jiǎn)單工廠模式(Simple Factory Pattern) :定義一個(gè)工廠類(lèi),它可以根據(jù)參數(shù)的不同返回不同類(lèi)的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類(lèi)。因?yàn)樵诤?jiǎn)單工廠模式中用于創(chuàng)建實(shí)例的方法是靜態(tài)(static)方法,因此簡(jiǎn)單工廠模式又被稱(chēng)為靜態(tài)工廠方法(Static Factory Method)模式,它屬于類(lèi)創(chuàng)建型模式。
簡(jiǎn)單工廠需要:
- 工廠結(jié)構(gòu)體
- 產(chǎn)品接口
- 產(chǎn)品結(jié)構(gòu)體
示例說(shuō)明
創(chuàng)建一個(gè)餃子店工廠結(jié)構(gòu)體,和餃子類(lèi)的接口。該工廠的其中一個(gè)方法用來(lái)生產(chǎn)不同口味的餃子,如韭菜的豬肉餡的。
type DumplingsShop struct{
Generate(t string) *Dumplings
}
type Dumplingsinterface interface {
create()
}
創(chuàng)建肉餡和韭菜餡的餃子結(jié)構(gòu)體,并且實(shí)現(xiàn)對(duì)應(yīng)接口的方法。
type DumplingsMeat struct{}
func (* DumplingsMeat)create(){
fmt.Println("DumplingsMeat create")
}
type DumplingsChives struct{}
func (* DumplingsChives)create(){
fmt.Println("DumplingsMeat create")
}
func(* DumplingsShop)Create(type string)*Dumplings{
switch type {
case "meat":
return new(DumplingsMeat)
case "chives":
return new(DumplingsChives)
default:
return nil
}
}
工廠實(shí)例化調(diào)用
var type string
dumplingFactory := DumplingsShop{}
type = "meat"
meat := dumplingFactory.Create(type)//返回肉餡餃子對(duì)象
meat.create()
type = "chives"
chives := dumplingFactory.Create(type) //返回韭菜餡餃子對(duì)象
chives.create()
簡(jiǎn)單工廠模式優(yōu)缺點(diǎn)
優(yōu)點(diǎn): 工廠類(lèi)是整個(gè)工廠模式的核心,我們只需要傳入給定的信息,就可以創(chuàng)建所需實(shí)例,在多人協(xié)作的時(shí)候,無(wú)需知道對(duì)象之間的內(nèi)部依賴(lài),可以直接創(chuàng)建,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。
缺點(diǎn): 工廠類(lèi)中包含了所有實(shí)例的創(chuàng)建邏輯,一旦這個(gè)工廠類(lèi)出現(xiàn)問(wèn)題,所有實(shí)例都會(huì)受到影響,并且,工廠類(lèi)中生產(chǎn)的產(chǎn)品都基于一個(gè)共同的接口,一旦要添加不同種類(lèi)的產(chǎn)品,這就會(huì)增加工廠類(lèi)的復(fù)雜度,將不同種類(lèi)的產(chǎn)品混合在一起,違背了單一職責(zé),系統(tǒng)的靈活性和可維護(hù)性都會(huì)降低,并且當(dāng)新增產(chǎn)品的時(shí)候,必須要修改工廠類(lèi),違背了『系統(tǒng)對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉』的原則。
工廠方法模式
工廠方法模式(英語(yǔ):Factory method pattern) 是一種實(shí)現(xiàn)了“工廠”概念的面向?qū)ο笤O(shè)計(jì)模式。就像其他創(chuàng)建型模式一樣,它也是處理在不指定對(duì)象具體類(lèi)型的情況下創(chuàng)建對(duì)象的問(wèn)題。工廠方法模式的實(shí)質(zhì)是“定義一個(gè)創(chuàng)建對(duì)象的接口,但讓實(shí)現(xiàn)這個(gè)接口的類(lèi)來(lái)決定實(shí)例化哪個(gè)類(lèi)。工廠方法讓類(lèi)的實(shí)例化推遲到子類(lèi)中進(jìn)行。”,實(shí)際應(yīng)用中工廠方法模式針對(duì)的是一個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)。
工廠方法需要:
- 工廠接口
- 工廠結(jié)構(gòu)體
- 產(chǎn)品接口
- 產(chǎn)品結(jié)構(gòu)體
示例說(shuō)明
創(chuàng)建一個(gè)餃子店工廠接口,和餃子類(lèi)的接口。該工廠用來(lái)生產(chǎn)不同口味的餃子,如韭菜的豬肉餡的。
type DumplingsShopinterface interface{
Generate(t string) *Dumplings
}
type Dumplingsinterface interface {
create()
}
創(chuàng)建北京和西安對(duì)應(yīng)餡的餃子結(jié)構(gòu)體,并且實(shí)現(xiàn)對(duì)應(yīng)接口的方法。
type BeijingDumplingsMeat struct{}
func (* BeijingDumplingsMeat)create(){
fmt.Println("BeijingDumplingsMeat create")
}
type BeijingDumplingsChives struct{}
...
type XianDumplingsMeat struct{}
...
type XianDumplingsChives struct{}
...
創(chuàng)建北京和西安工廠
type BeijingDumplings struct{}
type XianDumplings struct{}
func(* BeijingDumplings)Generate(t string) *Dumplings{
switch t {
case "chives" :
return new(BeijingDumplingsChives)
case "meat" :
return new(BeijingDumplingsMeat)
default:
return nil
}
}
func(* XianDumplings)Generate(t string) *Dumplings{
switch t{}
case "chives" :
return new(XianDumplingsChives)
case "meat" :
return new(XianDumplingsMeat)
default:
return nil
}
工廠實(shí)例化調(diào)用
var DumplingsShopFactory DumplingsShopinterface
DumplingsShopFactory := new(BeijingDumplings)
b = DumplingsShopFactory.Generate("meat") // 傳入肉餡的參數(shù),會(huì)返回北京市的肉餡餃子
b.create()
DumplingsShopFactory := new(XianDumplings)
b = DumplingsShopFactory.Generate("meat") // 同樣傳入肉餡的參數(shù),會(huì)返回北京市的肉餡餃子
b.create()
工廠方法模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn): 符合“開(kāi)閉”原則,具有很強(qiáng)的的擴(kuò)展性、彈性和可維護(hù)性。修改時(shí)只需要添加對(duì)應(yīng)的工廠類(lèi)即可使用了依賴(lài)倒置原則,依賴(lài)抽象而不是具體,使用(客戶(hù))和實(shí)現(xiàn)(具體類(lèi))松耦合。客戶(hù)只需要知道所需產(chǎn)品的具體工廠,而無(wú)須知道具體工廠的創(chuàng)建產(chǎn)品的過(guò)程,甚至不需要知道具體產(chǎn)品的類(lèi)名。
缺點(diǎn): 每增加一個(gè)產(chǎn)品時(shí),都需要一個(gè)具體類(lèi)和一個(gè)具體創(chuàng)建者,使得類(lèi)的個(gè)數(shù)成倍增加,導(dǎo)致系統(tǒng)類(lèi)數(shù)目過(guò)多,復(fù)雜性增加對(duì)簡(jiǎn)單工廠,增加功能修改的是工廠類(lèi);對(duì)工廠方法,增加功能修改的是產(chǎn)品類(lèi)。
抽象工廠模式
抽象工廠模式(英語(yǔ):Abstract factory pattern) 是一種軟件開(kāi)發(fā)設(shè)計(jì)模式。抽象工廠模式提供了一種方式,可以將一組具有同一主題的單獨(dú)的工廠封裝起來(lái)。在正常使用中,客戶(hù)端程序需要?jiǎng)?chuàng)建抽象工廠的具體實(shí)現(xiàn),然后使用抽象工廠作為接口來(lái)創(chuàng)建這一主題的具體對(duì)象。客戶(hù)端程序不需要知道(或關(guān)心)它從這些內(nèi)部的工廠方法中獲得對(duì)象的具體類(lèi)型,因?yàn)榭蛻?hù)端程序僅使用這些對(duì)象的通用接口。抽象工廠模式將一組對(duì)象的實(shí)現(xiàn)細(xì)節(jié)與他們的一般使用分離開(kāi)來(lái)。實(shí)際應(yīng)用中針對(duì)的多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)。
示例說(shuō)明
創(chuàng)建一個(gè)肉餡餃子店工廠接口和韭菜餡餃子店工廠接口,以及餃子類(lèi)的接口。
type DumplingsShopinterface interface{
GenerateMeatDumpling() *Dumplingsinterface
GenerateChivesDumpling() *Dumplingsinterface
}
type Dumplingsinterface interface {
create()
}
實(shí)現(xiàn)北京肉餡餃子、北京韭菜餃子、西安肉餡餃子、西安韭菜餃子4中實(shí)例對(duì)象。
type BeijingDumplingsMeat struct{}
func (* BeijingDumplingsMeat)create(){
fmt.Println("BeijingDumplingsMeat create")
}
type BeijingDumplingsChives struct{}
...
type XianDumplingsMeat struct{}
...
type XianDumplingsChives struct{}
...
創(chuàng)建北京和西安工廠
type BeijingDumplingsFactory struct{}
type XianDumplingsFactory struct{}
func(* BeijingDumplingsFactory)GenerateMeatDumpling() *Dumplings{
return new(BeijingDumplingsMeat)
}
}
func(* BeijingDumplingsFactory)GenerateChivesDumpling() *Dumplings{
return new(BeijingDumplingsChives)
}
}
func(* XianDumplingsFactory)GenerateMeatDumpling() *Dumplings{
return new(XianDumplingsMeat)
}
}
func(* XianDumplingsFactory)GenerateChivesDumpling() *Dumplings{
return new(XianDumplingsChives)
}
}
工廠示例調(diào)用
var DumplingsShopFactory DumplingsShopinterface
DumplingsShopFactory := new(BeijingDumplingsFactory)
b = DumplingsShopFactory.GenerateMeatDumpling() // 傳入肉餡的參數(shù),會(huì)返回北京市的肉餡餃子
b.create()
...
抽象工廠模式的優(yōu)缺點(diǎn)
優(yōu)點(diǎn): 抽象工廠模式除了具有工廠方法模式的優(yōu)點(diǎn)外,最主要的優(yōu)點(diǎn)就是可以在類(lèi)的內(nèi)部對(duì)產(chǎn)品族進(jìn)行約束。所謂的產(chǎn)品族,一般或多或少的都存在一定的關(guān)聯(lián),抽象工廠模式就可以在類(lèi)內(nèi)部對(duì)產(chǎn)品族的關(guān)聯(lián)關(guān)系進(jìn)行定義和描述,而不必專(zhuān)門(mén)引入一個(gè)新的類(lèi)來(lái)進(jìn)行管理。
缺點(diǎn): 產(chǎn)品族的擴(kuò)展將是一件十分費(fèi)力的事情,假如產(chǎn)品族中需要增加一個(gè)新的產(chǎn)品,則幾乎所有的工廠類(lèi)都需要進(jìn)行修改。所以使用抽象工廠模式時(shí),對(duì)產(chǎn)品等級(jí)結(jié)構(gòu)的劃分是非常重要的