<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
工廠模式(Factory Pattern
),提供了一種範例化(建立)物件的最佳方式。
在工廠模式中,首先定義了一個抽象的工廠類(class Factory
),並且在該工廠類中定義了提供了一個通用的、用於範例化物件的 Interface(介面)函數。然後當 Client
想要範例化某個具體的類的物件時,只需要將需求告訴工廠類即可,由工廠類按需求去完成物件的範例化並返回。而 Client 作為呼叫者,則無需知道物件範例化的任何細節,這意味著任意的 Client 都無需要考慮根據物件的範例化細節來調整自身的程式碼。
例如:當我們需要購買一批電腦,只要把我們的需求告訴電腦工廠,電腦工廠就會幫我們把這批電腦做好,而不用我們自己去做這個電腦的,也不用我們自己去知道這個電腦是怎麼做出來的,這就是工廠模式。
工廠模式帶來的好處就是幫助我們把物件的範例化部分抽取了出來,目的是降低系統中程式碼耦合度,並且增強了系統的擴充套件性。是一種解耦思想的實踐。
簡單工廠模式,只是做了一層簡單的封裝,將不同物件的範例化操作都單獨放到了一個工廠類中。
當我們需要範例化某個物件時,只需把我們的需求告訴簡單工廠類,然後由這個簡單工廠類根據我們的需求去建立對應的物件即可。適用於簡單的業務場景。
優點: 簡單工廠模式可以根據需求,動態生成使用者所需類的物件,而使用者不用去知道怎麼建立物件,使得各個模組各司其職,降低了系統的耦合性。
缺點: 擴充套件性差,違背了開閉原則(開閉原則指的是:軟體實現應該對擴充套件開放,對修改關閉)。新增產品時,需要修改簡單工廠類的程式碼。
實體角色:
import abc # 產品的抽象類 class Productor(metaclass=abc.ABCMeta): @abc.abstractmethod def product(self, car): pass # 更具體的某個產品類,是產品抽象類的子類 class Xiaomi(Productor): """ 小米手機 """ def product(self, price): return f"製造一部小米手機,售價{price}元" def __repr__(self): return f"Xiaomi,{id(self)}" # 更具體的某個產品類,是產品抽象類的子類 class Huawei(Productor): """ 華為手機 """ def product(self, price): return f"製造一部華為手機,售價{price}元" def __repr__(self): return f"Huawei,{id(self)}" # 簡單工廠類 class PhoneBrandFactory: """ 簡單工廠 """ def create_productor(self, brand): if brand == "Xiaomi": return Xiaomi() if brand == "Huawei": return Huawei() else: raise TypeError(f"沒有名為{brand}的手機生產商。") if __name__ == "__main__": # 通過簡單工廠類提供的介面函數來獲得某個具體的產品類的物件 Xiaomi = PhoneBrandFactory().create_productor("Xiaomi") Huawei = PhoneBrandFactory().create_productor("Huawei") print(Xiaomi) print(Huawei) print(Xiaomi.product(2999)) print(Huawei.product(5999))
工廠方法模式,工廠類派生了任意個子工廠類,每個子工廠類對應一個具體的產品類,則某個產品類的物件的範例化就交由這個子工廠類來完成。
工廠方法模式是簡單工廠模式的改進,當我們需要擴充套件一個新產品時,只需要擴充套件一個新的子工廠類即可,而不用去修改工廠類原有的程式碼,這樣就符合了開閉原則。
優點: 擴充套件性好,符合了開閉原則。新增一種產品時,只需增加改對應的產品類和對應的工廠子類即可。同時,也使得每個產品類和對應的工廠子類符合了單一職責原則,每個工廠只負責一種產品,而不是由一個工廠去生成所有商品。
缺點: 當我們新增產品時,還需要提供對應的工廠類,系統中類的個數將會成倍增加,相當於增加了系統的複雜性。
實體角色:
import abc # 產品的抽象類 class Productor(metaclass=abc.ABCMeta): @abc.abstractmethod def product(self, car): pass # 更具體的某個產品類,是產品抽象類的子類 class Xiaomi(Productor): """ 小米手機 """ def product(self, price): return f"製造一部小米手機,售價{price}元" def __repr__(self): return f"Xiaomi,{id(self)}" # 更具體的某個產品類,是產品抽象類的子類 class Huawei(Productor): """ 華為手機 """ def product(self, price): return f"製造一部華為手機,售價{price}元" def __repr__(self): return f"Huawei,{id(self)}" # 工廠類 class PhoneBrandFactory(metaclass=abc.ABCMeta): """ 抽象工廠 """ @abc.abstractmethod def create_productor(self, brand): pass # 具體產品對應的子工廠類 class XiaomiFactory(PhoneBrandFactory): def create_productor(self): return Xiaomi() # 具體產品對應的子工廠類 class HuaweiFactory(PhoneBrandFactory): def create_productor(self): return Huawei() if __name__ == "__main__": # 由這個子工廠類來完成對應的某個產品類的物件範例化 Xiaomi = XiaomiFactory().create_productor() Huawei = HuaweiFactory().create_productor() print(Xiaomi) print(Huawei) print(Xiaomi.product(2999)) print(Huawei.product(5999))
抽象工廠模式,又是工廠方法模式的改進。工廠方法模式解決的是生產不同品牌的同一型別的電腦,而抽象工廠模式解決的是生產不同品牌的多種型別的電腦。
比如,工廠方法模式中的電腦工廠只能生產老式的臺式電腦,而如果現在需要生產臺式電腦,筆記型電腦,平板電腦等多個種類的電腦的話,那麼工廠方法模式就不太方便了。而抽象工廠模式可以解決電腦工廠生產多個種類電腦的問題,也就是解決一個工廠生產多種型別的產品的問題。
如果我們需要臺式電腦,又需要筆記型電腦,要多種產品時,工廠方法模式無法滿足我們的需求;而抽象方法模式,提前在抽象工廠中,定義好了可能需要的多種產品,比如:臺式電腦,筆記型電腦,平板電腦等,當有需求的時候,我們只需要建立相關子類和相關子工廠類即可。
優點: 抽象工廠類建立了多個型別的產品,當有需求時,可以建立相關子產品類和子工廠類來獲取。也就是可以滿足生產不同品牌的不同型別的電腦。
缺點: 擴充套件新種類產品時困難。抽象工廠模式需要我們在工廠抽象類中提前確定了可能需要的產品種類,以滿足不同品牌的多種產品的需求。但是如果我們需要的產品種類並沒有在工廠抽象類中提前確定,那我們就需要去修改工廠抽象類了,而一旦修改了工廠抽象類,那麼所有的工廠子類也需要修改,這樣顯然擴充套件不方便。
實體角色:
import abc # 產品功能特性抽象類 class PhoneShell(metaclass=abc.ABCMeta): @abc.abstractmethod def shell(self): pass class Cpu(metaclass=abc.ABCMeta): @abc.abstractmethod def cpu(self): pass class OS(metaclass=abc.ABCMeta): @abc.abstractmethod def system(self): pass # 具體的產品功能特性類 class SmallShell(PhoneShell): @property def shell(self): return "小螢幕" class BigShell(PhoneShell): @property def shell(self): return "大螢幕" class SnapDragonCpu(Cpu): @property def cpu(self): return "驍龍cpu" class AppleCpu(Cpu): @property def cpu(self): return "蘋果cpu" class Android(OS): @property def system(self): return "安卓系統" class IOS(OS): @property def system(self): return "IOS系統" # 產品的抽象類 class ProductPhone: def __init__(self, factory): self.factory = factory() def product(self): self.shell = self.factory.product_shell() self.cpu = self.factory.product_cpu() self.OS = self.factory.product_system() def show_info(self): print(f"{self.factory}", f"設定資訊:{self.shell.shell}, {self.cpu.cpu}, {self.OS.system}") # 具體的產品子類 class XiaomiFactory(PhoneFactory): def product_shell(self): return BigShell() def product_cpu(self): return SnapDragonCpu() def product_system(self): return Android() def __repr__(self): return "小米手機,售價2999!" class IphoneFactory(PhoneFactory): def product_shell(self): return SmallShell() def product_cpu(self): return AppleCpu() def product_system(self): return IOS() def __repr__(self): return "蘋果手機,售價8999!" # 抽象工廠類 class PhoneFactory(metaclass=abc.ABCMeta): @abc.abstractmethod def product_shell(self): pass @abc.abstractmethod def product_cpu(self): pass @abc.abstractmethod def product_system(self): pass if __name__ == "__main__": xiaomi = ProductPhone(XiaomiFactory) xiaomi.product() xiaomi.show_info() iphone = ProductPhone(IphoneFactory) iphone.product() iphone.show_info()
到此這篇關於Python設計模式中的建立型工廠模式的文章就介紹到這了,更多相關Python工廠模式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45