抽象工廠模式
工廠模式,屬於設計模式三大類之一的建立模式裡。
其核心思想是提供乙個建立物件的超類,允許通過該介面指定建立子類物件的型別。
從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...