對照下面模板類圖作個簡單說明抽象工廠的四個角色叭。
抽象工廠角色:即圖中的abstract creator,抽象工廠核心,也就是那個「超級工廠」,與應用程式無關,超級工廠所建立的工廠必須實現提供的介面
具體工廠角色:即圖中的creator,用於建立具體產品物件。
抽象產品角色:即圖中的abstract product a/b,為建立產品的基類,所生產的具體產品需實現抽象產品角色所提供的介面。
具體產品角色:即圖中的producta_1,productb_1之類,實現抽象產品角色提供的介面,由具體工廠進行建立。
同樣以生產披薩跟漢堡為情景。
首先可以先看看抽象產品,也就是abstract product a/b,在這裡就是pizza與hamburger,提供獲取具體產品的介面。也就是所有的pizza例項(即具體產品)都需要實現producepizza,以獲得自己特色的pizza(ham同理)。
//抽象產品
type pizza inte***ce
type hamburger inte***ce
接下來可以先看看抽象工廠,抽象工廠是乙個「超級工廠」,是為了建立其他工廠。在這裡我們定義乙個foodfactory的inte***ce作為抽象工廠(即圖中的abstract creator)。所有的具體工廠(creator_1/2)需要實現createpizza與createhamburger,以獲取具體產品。
可以簡單理解為,所有的具體工廠,都需要能夠建立自己的比薩與漢堡。
// 抽象工廠
type foodfactory inte***ce
之後就是具體工廠與具體產品了,假設有個kfc,能夠生產kfc pizza與 kfc hamburger。那這裡的具體工廠就是kfc factory,具體產品則是kfcpizza與kfcham(具體產品)。而這個具體工廠就需要實現createpizza()與createhambuger(),分別返回pizza與hamburger型別的具體產品。
// 具體工廠
type kfcfactory struct
func
(*kfcfactory)
createpizza
() pizza
}func
(*kfcfactory)
createhamburger
() hamburger
}
因為具體產品kfcpizza月kfchamburger是作為pizza/hamburger型別返回,所以需要實現pizza/hamburger介面內的方法。
// 具體產品
type kfcpizza struct
type kfchamburger struct
func
(*kfcpizza)
producepizza()
string
func
(*kfchamburger)
produceham()
string
至此抽象工廠模式的四個角色就全部就位了~
首先我們宣告乙個factory是foodfactory抽象工廠,令其為乙個kfcfactory具體工廠,然後則可以使用這個具體工廠建立自己的漢堡、比薩進行生產,如下。
func
testabstractfactory
(t *testing.t)
p1 := factory.
createhamburger()
.produceham()
p2 := factory.
createpizza()
.producepizza()
fmt.
printf
("p1:%v\np2:%v\n"
, p1, p2)
}
抽象工廠目的是解耦,那在擴充套件時是否符合開閉原則呢?
參照上面的類圖,分為兩種情況:
1.擴充套件abstract product c。
除了漢堡、比薩,我們要生產新的東西比如冰淇淋,這個時候,既有的具體工廠creator_1與creator_2(有可能還有更多),以及抽象工廠全部需要增加相應 的內容以提供具體產品productc_n,這時候不符合開閉原則。
2.擴充套件新的具體工廠/具體產品creator_3,producta_3, productb_3
除了kfc工廠,我們現在需要增加麥當勞工廠,生產麥當勞比薩、麥當勞漢堡。這個時候新增的邏輯不會對現有kfc工廠產生任何影響。包括後續增加必勝客工廠等等,都不會對現有工廠產生影響,所以符合開閉原則。
因此,抽象工廠模式適用於:增加產品族可能性較大,增加產品可能性較小的場景。
抽象工廠模式 Go語言設計模式 抽象工廠
想象一下你需要買包括運動鞋和運動服的運動套裝,大多數時候你想買同乙個工廠生產的一套運動套裝,比如nike套裝或adidas套裝。你想要的具體產品是成套的鞋子和短褲,這就是抽象工廠運用的場景,這些產品將由nike或adidas的抽象工廠建立。以下是工廠介面 以下是兩個產品介面 現在讓我們來看抽象工廠介...
go設計模式之抽象工廠
以下就是實現的 package main import fmt type iproduct inte ce type iphone struct func p iphone showbrand type mac struct func pc mac showbrand type factory in...
設計模式 工廠模式 抽象工廠模式
建立物件時不會對客戶暴露建立邏輯,並且通過使用乙個共同的介面來指向建立的物件。sept1 建立乙個公共介面,將要對外開放的方法在這裡定義。sept2 建立實現介面的類,用即實現對外開放的類的方法 sept3 建立工廠,提供乙個get方法,這個方法提供返回實現類的物件 建立選擇 sept4 使用,建立...