Go設計模式 抽象工廠模式

2021-10-11 03:07:25 字數 2434 閱讀 9061

對照下面模板類圖作個簡單說明抽象工廠的四個角色叭。

抽象工廠角色:即圖中的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 使用,建立...