工廠模式(Factory Pattern):屬于創建型模式,它提供了一種創建物件的最佳方式,在工廠模式中,我們 在創建物件時不會對客戶端暴露創建邏輯,并且是通過使用一個共同的介面來指向新創建的物件 ,
意圖: 定義一個創建物件的介面,讓其子類自己決定實體化哪一個工廠類,工廠模式使其創建程序延遲到子類進行,
主要解決: 主要解決介面選擇的問題,
何時使用: 我們明確地計劃不同條件下創建不同實體時,
如何解決: 讓其子類實作工廠介面,
關鍵代碼: 創建程序在其子類執行,
優點: 1、一個呼叫者想創建一個物件,只要知道其名稱就可以了, 2、擴展性高,如果想增加一個產品,只要擴展一個工廠類就可以, 3、屏蔽產品的具體實作,呼叫者只關心產品的介面,
缺點: 每次增加一個產品時,都需要增加一個具體類和物件實作工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的復雜度,同時也增加了系統具體類的依賴,這并不是什么好事,
注意事項: 作為一種創建類模式,在任何需要生成復雜物件的地方,都可以使用工廠方法模式,有一點需要注意的地方就是復雜物件適合使用工廠模式,而簡單物件,特別是只需要通過 new 就可以完成創建的物件,無需使用工廠模式,如果使用工廠模式,就需要引入一個工廠類,會增加系統的復雜度,
應用實體:我想買一些水果(橘子、哈密瓜和葡萄),我可以直接從水果工廠里面購買,但是我不需要知道這些水果的產地是哪里的,它們是如何運輸和包裝的,以及水果工廠的相關流水線是如何運作的,

那我們來一起看看如何使用工廠模式,實作一個購買不同水果的小專案?(づ。????。)づ
實作的思路:
- 專案的主體包含3個部分:
消費者(買水果的人),水果工廠(賣水果的人),水果大類(實作隱藏的工廠內部細節) 消費者主要向水果工廠傳達“購買需求”的相關資訊(水果的種類、包裝、重量等...);水果工廠主要針對消費者的不同“購買需求”將呼叫不同的水果大類中的子類方法;水果大類主要劃分為各種小類,針對每一類水果有獨特的設計實作細節,
專案的UML用例圖如下:

實作的代碼如下:
class Fruit:
# 水果大類
def __init__(self, name, weight):
self.name = name
self.weight = weight
self.price = None
# 計算購買金額的抽象介面
def purchase(self):
pass
# 展示購買資訊的抽象介面
def show(self):
pass
class Orange(Fruit):
# 橘子類
def __init__(self, name, weight, variety):
Fruit.__init__(self, name, weight)
# 不同的橘子型別,價格不同
if variety == 1:
self.price = 8.5
else:
self.price = 11.0
# 設定購買的橘子的型別
self.variety = variety
def purchase(self):
money = self.price * self.weight
return money
def show(self):
money = self.purchase()
print("您購買的水果:%s,單價為:%s(千克/元),重量為:%f千克\n需要支付的金額共計為:%f元" %
(self.name, self.price, self.weight, money))
class Hami_Melon(Fruit):
# 哈密瓜類
def __init__(self, name, weight):
Fruit.__init__(self, name, weight)
# 設定哈密瓜的單價
self.price = 24.3
def purchase(self):
money = self.price * self.weight
return money
def show(self):
money = self.purchase()
print("您購買的水果:%s,單價為:%s(千克/元),重量為:%f千克\n需要支付的金額共計為:%f元" %
(self.name, self.price, self.weight, money))
class Grape(Fruit):
# 葡萄類
def __init__(self, name, weight, pack):
Fruit.__init__(self, name, weight)
# 設定葡萄的單價
self.price = 16.2
# 設定葡萄的包裝方式
self.pack = pack
def purchase(self):
money = self.price * self.weight
return money
def show(self):
money = self.purchase()
print("您購買的水果:%s,單價為:%s(千克/元),重量為:%f千克\n需要支付的金額共計為:%f元" %
(self.name, self.price, self.weight, money))
class FruitFactory:
# 水果工廠類
def get_info(self, name, weight, variety, pack):
weight = float(weight)
variety, pack = int(variety), int(pack)
if variety == 0 and pack == 0:
new_object = Hami_Melon(name, weight)
return new_object
elif variety > 0 and pack == 0:
new_object = Orange(name, weight, variety)
return new_object
elif variety == 0 and pack > 0:
new_object = Orange(name, weight, pack)
return new_object
else:
return None
class Consumer:
# 消費者類
def __init__(self):
# 輸入原始的“購買需求”資訊
self.name = input("請輸入你要購買的水果名稱:orange / hami_Melon / grape\n")
self.weight = input("請輸入你要購買水果的重量(kg):\n")
self.variety = input("如果您購買橘子,我們有2種橘子:0.不買橘子 1.甘橘 2.砂糖橘\n")
self.pack = input("如果您購買葡萄,有2中包裝方式:0.不買葡萄 1.散稱 2.盒裝\n")
def request(self):
# 回傳相關的購買資訊
return self.name, self.weight, self.variety, self.pack
if __name__ == '__main__':
# 創建顧客
buyer = Consumer()
# 拿到顧客的購買資訊
buy_info = buyer.request()
# 使用水果工廠,傳達指令至水果大類并執行購買操作
buy_res = FruitFactory().get_info(buy_info[0], buy_info[1], buy_info[2], buy_info[3])
# 購買資訊的展示
buy_res.show()
相關的測驗用例:



本文關于設計模式的講解思想,參考鏈接:抽象工廠模式
如果有對python類的創建和繼承等用法還不熟悉的小伙伴,請參考這篇博客: python類的繼承
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/286773.html
標籤:python
