Go實現設計模式 工廠模式

2021-10-04 03:45:12 字數 3851 閱讀 2343

抽象工廠模式

工廠模式,屬於設計模式三大類之一的建立模式裡。

其核心思想是提供乙個建立物件的超類,允許通過該介面指定建立子類物件的型別。

從go的角度應用的說,工廠模式就是提供乙個超類,這個超類有乙個建立介面,我們可以通過這個介面獲取不同的物件,這些物件實現了同一系列的介面,所以他們可以用同乙個inte***ce表示,他們各自實現了這乙個inte***ce底下所有的介面,工廠模式的作用就是將他們的建立步驟收斂起來,而建立出來的物件,我們可以叫做工廠的產品。

使用者不用管工廠產品的實現是什麼,只用管要用哪個產品來處理自己的場景即可。

參考:1.使用物件型別數目不定,且使用物件針對inte***ce方法的實現各有各的差別(若是一套就沒必要用工廠方法來建立不同的物件了),這時候由於工廠模式將產品構建與產品使用的**分開,在擴充套件上方便很多,只需要乙個新的子類,再實現父類方法就好了。

2.當想節省系統資源時候使用factory方法,如你想重用已有物件,又希望能在沒有相應物件的建立新的物件,這時候將所有同類物件收斂到factory,對於你的搜尋和建立都會簡單很多。

3.為庫或者框架使用者提供拓展其內部元件的方法。

基礎庫有基礎庫的物件a,和行為1的實現a1,這時候作為基礎庫的使用者,希望針對行為1做自己的重寫覆蓋,若是基礎庫中使用的是工廠模式返回的統一inte***ce,那麼作為使用者,只需要重寫物件u1,實現inte***ce的所有方法,並覆蓋行為1,為實現u1,在建立的時候將自己的物件u返回,替換掉a就成功實現了替代。

你有乙個披薩店,你的披薩店有orderpizza()函式,用於新建乙個披薩,舊的**如下(此處簡化書上的**)

orderpizze

(ptype string

)pizza

else

if ptype==

"b" pizza.

prepare()

return pizza

}

一般情況,使用函式根據不同型別返回不同的披薩沒有問題,但是隨著型別新增,我們就要不斷的對函式做修改,函式也會越來越大。

將根據不同型別建立不同pizza的行為挪出來,放到另乙個物件中,由這個物件專職建立pizza,這個新物件就稱作工廠。

解釋

在如下**中

pizza作為介面(inte***ce),各種不同的pizza(product)可以實現不同的prepare方法

******pizzafactory 是乙個具體的工廠物件,他根據ptype的不同建立不同的pizza並返回

pizzastore是我們的pizza商店,它不再關心pizza的具體誕生,它內含有工廠(可以有不同種類的工廠),每次點單,就將點單的引數傳遞給工廠,由工廠生產pizza,若工廠無能力生產所需要的pizza則返回空

type pizza inte***ce

type cheesepizza struct

func

(s *cheesepizza)

prepare()

type ******pizzafactory struct

func

(s *******pizzafactory)

createpizza

(ptype string

)pizza

return

nil}

type pizzastore struct

func

(s *pizzastore)

pizzastore

(factory ******pizzafactory)

func

(s *pizzastore)

orderpizza

(ptype string

)pizza

pizza.

prepare()

return pizza

}func

main()

抽象工廠是一種創新的設計模式,可讓您生成相關同一族的物件而無需指定其具體類。

1.針對產品系列的每個產品,建立超類介面,各個系列不同產品根據需求實現對應的inte***ce。

2.第二步宣告抽象工廠,該介面有所有系列產品的建立方法列表。

3.接著我們根據不同型別,返回不同的工廠物件,同一工廠物件生產的產品就能保證是乙個系列的。

個人感覺抽象工廠模式更像是工廠模式的一種變體,只不過將層次往上提了一層,根據不同的型別返回不同的工廠,而工廠早早的根據自己的型別,確定了生產這一系列產品的型別。

當您的**需要使用各種相關產品系列時,可以考慮使用抽象工廠模式。

解釋

整體流程:

宣告獲取紐約商店—》從紐約商店點起司披薩—》建立紐約的起司披薩物件—》準備披薩–》由於紐約商店的調料工廠是紐約的—》準備披薩的時候使用調料工廠獲取紐約調料—》披薩出爐

//產品麵糰

type dough inte***ce

//產品調味

type sause inte***ce

//具體實現產品1

type nydough struct

func

(s *nydough)

getdough()

//具體實現產品2

type nysause struct

func

(s *nysause)

getsause()

//披薩工廠類的宣告

type pizzaingredientfactory inte***ce

//ny披薩工廠類的宣告,可以看到內部已經指定了產品都是ny系列

type nypizzaingredientfactory struct

func

(s *nypizzaingredientfactory)

createdough

()dough

func

(s *nypizzaingredientfactory)

createsause

()sause

//披薩的inte***ce

type pizza inte***ce

type pizzastore inte***ce

type nycheesepizza struct

func

(s *nycheesepizza)

prepare()

func

(s *nycheesepizza)

getingredientfactory

(factory pizzaingredientfactory)

//不同地方的經營商,這裡是具現化的ny披薩商店

type nystypepizzastore struct

func

(s *nystypepizzastore)

createpizza

(ptype string

)pizza

return pizza

}func

(s *nystypepizzastore)

orderpizza

(ptype string

)pizza

return pizza

}func

main()

輸出

this is nydough

this is nysause

this is nycheese pizza.

參考文章:

head first設計模式

Go設計模式 簡單工廠模式

假設有n多個工廠,生產不同的物品,他們擁有相同的行為 生產 但是通過呼叫 生產 的方法,獲取到的是不同的東西。再比個打方,狗子,羊子,喵子都會叫,但叫一下卻發出不同的聲音。實踐中有很多類似的情況,使用簡單工廠模式可以只告知 我是個什麼東西 就可以使用相同的方法來獲取想要的值。比如我告訴它,我是條狗,...

Go設計模式 抽象工廠模式

對照下面模板類圖作個簡單說明抽象工廠的四個角色叭。抽象工廠角色 即圖中的abstract creator,抽象工廠核心,也就是那個 超級工廠 與應用程式無關,超級工廠所建立的工廠必須實現提供的介面 具體工廠角色 即圖中的creator,用於建立具體產品物件。抽象產品角色 即圖中的abstract p...

實現設計模式 工廠模式

工廠模式將建立物件的 從客戶 中分離,提供了一種在大系統中管理建立眾多物件的有效方法。當從配置檔案或流中建立物件時,經常採用這種模式。這裡提供一種通用實現,可以作為參考。include include namespace factory private allocator m allocate te...