簡單工廠模式算法
# 一個工廠管多件產品
""" 內容: 不直接向客戶端暴露對象建立的實現細節,而是經過一個工廠類來負責建立產品類的實例。 角色: 工廠角色(Creator) 抽象產品角色(Product) 具體產品角色(Concrete Product) """ # 優缺點: """ 優勢 隱藏了對象建立的實現細節 客戶端不須要修改代碼 缺點: 違反了單一職責原則,將建立邏輯幾種到一個工廠類裏 當添加新產品時,須要修改工廠類代碼,違反了開閉原則 """
代碼實現shell
from abc import abstractmethod, ABCMeta class Payment(metaclass=ABCMeta): @abstractmethod def pay(self, money): raise NotImplementedError class Alipay(Payment): def __init__(self, use_huabei=False): self.use_huabei = use_huabei def pay(self, money): if self.use_huabei: print("花唄支付%s元" % money) else: print("支付寶支付%s元" % money) class ApplePay(Payment): def __init__(self): pass def pay(self, money): print("蘋果支付%s元" % money) class PaymentFactory: # 隱藏對象建立的細節,客戶端不序修改代碼,至關於中間人 def create_payment(self, method): if method == "alipay": return Alipay() elif method == "applepay": return ApplePay() elif method == "huabei": return Alipay(use_huabei=True) else: raise NameError(method) # p = Alipay() factory = PaymentFactory() p = factory.create_payment("huabei") p.pay(100)
工廠方法模式數據庫
# 一個工廠管一件產品 # 內容: 定義一個用於建立對象的接口(工廠接口),讓子類決定實例化哪個產品類。 # 角色: 抽象工廠角色(Creator) 接口 具體工廠角色(Concrete Creator) 抽象產品角色(Product) 具體產品角色(Concrete Product) 工廠方法模式相比簡單工廠模式將每一個具體產品都對應了一個具體工廠。 # 使用場景 須要生產多種、大量複雜對象的時候 須要下降耦合度的時候 當系統中的產品種類須要常常擴展的時候 # 優缺點 """ 優勢: 每一個具體產品都對應一個具體工廠類,不須要修改工廠類代碼 隱藏了對象建立的實現細節 缺點: 每增長一個具體產品類,就必須增長一個相應的具體工廠類 """
代碼實現微信
from abc import abstractmethod, ABCMeta class Payment(metaclass=ABCMeta): @abstractmethod def pay(self, money): pass class Alipay(Payment): def __init__(self, use_huabei=False): self.use_huabei = use_huabei def pay(self, money): if self.use_huabei: print("花唄支付%s元" % money) else: print("支付寶支付%s元" % money) class ApplePay(Payment): def pay(self, money): print("蘋果支付%s元" % money) class WechatPay(Payment): def pay(self, money): print("微信支付%s元" % money) class PaymentFactory(metaclass=ABCMeta): @abstractmethod def create_payment(self): pass class AlipayFactory(PaymentFactory): def create_payment(self): return Alipay() class ApplePayFactory(PaymentFactory): def create_payment(self): return ApplePay() class HuabeiFactory(PaymentFactory): def create_payment(self): return Alipay(use_huabei=True) class WechatFactory(PaymentFactory): def create_payment(self): return WechatPay() factory = HuabeiFactory() p = factory.create_payment() p.pay(100)
抽象工廠模式app
# 相比工廠方法模式,每一個抽象工廠模式中的每一個具體工廠都生產一套產品。 """ 內容: 定義一個工廠類接口,讓工廠子類來建立一系列相關或相互依賴的對象。 例: 生產一部手機,須要手機殼、CPU、操做系統三類對象進行組裝,其中每類對象都有不一樣的種類。對每一個具體工廠,分別生產一部手機所須要的三個對象。 角色: 抽象工廠角色(Creator) 具體工廠角色(Concrete Creator) 抽象產品角色(Product) 具體產品角色(Concrete Product) 客戶端(Client) 相比工廠方法模式,抽象工廠模式中的每一個具體工廠都生產一套產品。 """ # 適用場景 """ 系統要獨立於產品的建立與組合時 強調一系列相關的產品對象的設計以便進行聯合使用時 提供一個產品類庫,想隱藏產品的具體實現時 """ # 優缺點 """ 優勢: 將客戶端與類的具體實現相分離 每一個工廠建立了一個完整的產品系列,使得易於交換產品系列 有利於產品的一致性(即產品之間的約束關係) 缺點: 難以支持新種類的(抽象)產品 """
代碼實現微信支付
from abc import abstractmethod, ABCMeta # ------抽象產品------ class PhoneShell(metaclass=ABCMeta): @abstractmethod def show_shell(self): pass class CPU(metaclass=ABCMeta): @abstractmethod def show_cpu(self): pass class OS(metaclass=ABCMeta): @abstractmethod def show_os(self): pass # ------抽象工廠------ class PhoneFactory(metaclass=ABCMeta): @abstractmethod def make_shell(self): pass @abstractmethod def make_cpu(self): pass @abstractmethod def make_os(self): pass # ------具體產品------ class SmallShell(PhoneShell): def show_shell(self): print("普通手機小手機殼") class BigShell(PhoneShell): def show_shell(self): print("普通手機大手機殼") class AppleShell(PhoneShell): def show_shell(self): print("蘋果手機殼") class SnapDragonCPU(CPU): def show_cpu(self): print("驍龍CPU") class MediaTekCPU(CPU): def show_cpu(self): print("聯發科CPU") class AppleCPU(CPU): def show_cpu(self): print("蘋果CPU") class Android(OS): def show_os(self): print("Android系統") class IOS(OS): def show_os(self): print("iOS系統") # ------具體工廠------ class MiFactory(PhoneFactory): def make_cpu(self): return SnapDragonCPU() def make_os(self): return Android() def make_shell(self): return BigShell() class HuaweiFactory(PhoneFactory): def make_cpu(self): return MediaTekCPU() def make_os(self): return Android() def make_shell(self): return SmallShell() class IPhoneFactory(PhoneFactory): def make_cpu(self): return AppleCPU() def make_os(self): return IOS() def make_shell(self): return AppleShell() # ------客戶端------ class Phone: def __init__(self, cpu, os, shell): self.cpu = cpu self.os = os self.shell = shell def show_info(self): print("手機信息:") self.cpu.show_cpu() self.os.show_os() self.shell.show_shell() def make_phone(factory): cpu = factory.make_cpu() os = factory.make_os() shell = factory.make_shell() return Phone(cpu, os, shell) p1 = make_phone(IPhoneFactory()) p1.show_info()
建造者模式ui
# 建造者模式與抽象工廠模式類似,也用來建立複雜對象。着重構造順序 """ 內容: 將一個複雜對象的構建與它的表示分離,使得一樣的構建過程能夠建立不一樣的表示。 角色: 抽象建造者(Builder) 具體建造者(Concrete Builder) 指揮者(Director) 產品(Product) 建造者模式與抽象工廠模式類似,也用來建立複雜對象。主要區別是建造者模式着重一步步構造一個複雜對象, 而抽象工廠模式着重於多個系列的產品對象。 """ # 適用場景 """ 當建立複雜對象的算法(Director)應該獨立於該對象的組成部分以及它們的裝配方式(Builder)時 當構造過程容許被構造的對象有不一樣的表示時(不一樣Builder)。 """ # 優缺點 """ 優勢 隱藏了一個產品的內部結構和裝配過程 將構造代碼與表示代碼分開 能夠對構造過程進行更精細的控制 """
代碼實現spa
from abc import abstractmethod, ABCMeta # ------產品------ class Player: def __init__(self, face=None, body=None, arm=None, leg=None): self.face = face self.arm = arm self.leg = leg self.body = body def __str__(self): return "%s, %s, %s, %s" % (self.face, self.arm, self.body, self.leg) # ------建造者------ class PlayerBuilder(metaclass=ABCMeta): @abstractmethod def build_face(self): pass @abstractmethod def build_arm(self): pass @abstractmethod def build_leg(self): pass @abstractmethod def build_body(self): pass @abstractmethod def get_player(self): pass class BeautifulWomanBuilder(PlayerBuilder): def __init__(self): self.player = Player() def build_face(self): self.player.face = "漂亮臉蛋" def build_arm(self): self.player.arm = "細胳膊" def build_body(self): self.player.body = "細腰" def build_leg(self): self.player.leg = "長腿" def get_player(self): return self.player class PlayerDirector: # 控制順序 def build_player(self, builder): builder.build_body() builder.build_face() builder.build_arm() builder.build_leg() return builder.get_player() pd = PlayerDirector() pb = BeautifulWomanBuilder() p = pd.build_player(pb) print(p)
單例模式操作系統
# 內容: 保證一個類只有一個實例,並提供一個訪問它的全局訪問點。 # 角色: 單例(Singleton) # 適用場景 當類只能有一個實例並且客戶能夠從一個衆所周知的訪問點訪問它時 文件系統 數據庫鏈接對象 日誌對象 # 優勢: 對惟一實例的受控訪問 單例至關於全局變量,但防止了命名空間被污染 # 與單例模式功能類似的概念: 全局變量、靜態變量(方法)
實例prototype
class Singleton(object): def __new__(cls,*args,**kwargs): if not hasattr(cls,"_instance"): cls._instance=super(Singleton,cls).__new__(cls) return cls._instance class Myclass(Singleton): def __init__(self,name=None): if name is not None: self.name=name a = MyClass("a") print(a) print(a.name) b = MyClass("b") print(b) print(b.name) print(a) print(a.name)
小結
使用抽象工廠模式,prototype(原型模式)或者建造者模式的設計甚至比使用工廠方法模式的那些設計更靈活,但他們也更加複雜。一般,設計以使用工廠方法模式開始,當設計者發現須要更大的靈活性時,設計便會向其餘建立模式演化。當你在設計標準之間進行權衡的時候,瞭解多個模式能夠給你提供更多的選擇餘地
依賴於繼承的建立型模式:
工廠方法模式
依賴於組合的建立性模式:
抽象工廠模式、建立者模式
1