首頁 > 軟體

python工廠方法模式原理與實現

2022-02-16 13:00:35

一、簡介

工廠模式是屬於建立型模式,它提供了一種建立物件的最佳方式。

在工廠模式中,我們在建立物件的過程中不會向用戶端暴露實現邏輯,而是通過一個共同的介面類來指向新建立的物件。

二、工廠方法模式的主要角色

抽象工廠(Abstract Factory):提供了建立產品的介面,呼叫者通過它存取具體工廠的工廠方法newProduct()來建立產品。
具體工廠(ConcreteFactory):主要實現抽象工廠中的抽象方法,完成具體產品的建立。
抽象產品(Product):定義了產品的規範,描述了產品的主要特性和功能。
具體產品(ConcreteProduct):實現了抽象產品定義的介面,由具體工廠來建立,它同具體工廠之間一一對應。

三、簡單工廠模式

內容:不直接向用戶端暴露物件建立實現的細節,而是通過工廠類來負責建立產品類的範例。

具體程式碼(jiandan.py):

from abc import ABCMeta, abstractmethod
 
class Payment(metaclass=ABCMeta):
    @abstractmethod
    def pay(self):
        pass
 
class WechatPay(Payment):
    def pay(self, money):
        print("微信支付%s" % money)
        return
 
class Alipay(Payment):
    def __init__(self, huabei=False):
        self.huabei = huabei
    def pay(self, money):
        if self.huabei:
            print("花唄支付%s" % money)
        else:
            print("支付寶餘額支付%s" % money)
 
class PaymentFactory:
    def create_pay(self, method):
        if method == "wechat":
            return WechatPay()
        elif method == "alipay":
            return Alipay()
        elif method == "huabei":
            return Alipay(huabei=True)
        else:
            raise TypeError("No such payment name %s" % method)
 
# client
pf = PaymentFactory()
p = pf.create_pay("huabei")
p.pay(100)

結果:

ABCMeta是python的一個元類,用於在Python程式中建立抽象基礎類別,抽象基礎類別中宣告的抽象方法,使用abstractmethod裝飾器裝飾。

簡單明瞭的說:建立一個公共的抽象類,然後建立多個支付的類繼承這個抽象類,各種支付類裡實現具體的支付方式,通過工廠類選擇支付方式,這樣客服端只實現支付方式,不需要知道具體的實現方法。

優點:

隱藏了物件建立的實現細節使用者端不需要修改程式碼

缺點:

違反了單一職責原則,將建立邏輯集中到一個工廠類裡當新增新產品時,需要修改工廠類程式碼,違反了開閉原則 

四、工廠模式

內容:定義了一個用於建立物件的介面(工廠類),讓工廠子類決定範例化哪一個產品類。

具體程式碼(factory_method.py):

from abc import ABCMeta, abstractmethod
 
class Payment(metaclass=ABCMeta):
    @abstractmethod
    def pay(self):
        pass
 
class WechatPay(Payment):
    def pay(self, money):
        print("微信支付%s" % money)
        return
 
class Alipay(Payment):
    def __init__(self, huabei=False):
        self.huabei = huabei
    def pay(self, money):
        if self.huabei:
            print("花唄支付%s" % money)
        else:
            print("支付寶餘額支付%s" % money)
 
class PaymentFactory(metaclass=ABCMeta):
    @abstractmethod
    def create_method(self):
        pass
 
class AlipayFactory(PaymentFactory):
    def create_method(self):
        return Alipay()
 
class WechatFactory(PaymentFactory):
    def create_method(self):
        return WechatPay()
 
class HuabeiFactory(PaymentFactory):
    def create_method(self):
        return Alipay(huabei=True)
 
pf = HuabeiFactory()
p = pf.create_method()
p.pay(100)

結果:

五、抽象工廠模式

 內容:定義一個工廠類介面,讓工廠子類來建立一系列相關或者相互依賴的物件。

與工廠模式相比,抽象工廠模式中的每一個產品都生產一套產品。

具體程式碼(abstract_factory.py):

from abc import ABCMeta, abstractmethod
"""
抽象產品
"""
 
class PhoneShell(metaclass=ABCMeta):
    @abstractmethod
    def show_shell(self):
        pass
 
class OS(metaclass=ABCMeta):
    @abstractmethod
    def show_os(self):
        pass
 
class CPU(metaclass=ABCMeta):
    @abstractmethod
    def show_cpu(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 AppleOS(OS):
    def show_os(self):
        print("蘋果OS系統")
 
class AndroidOS(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 AndroidOS()
    def make_shell(self):
        return BigShell()
 
class HuaweiFactory(PhoneFactory):
    def make_cpu(self):
        return MediaTekCPU()
    def make_os(self):
        return AndroidOS()
    def make_shell(self):
        return SmallShell()
 
class IPhoneFactory(PhoneFactory):
    def make_cpu(self):
        return AppleCPU()
    def make_os(self):
        return AppleOS()
    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(MiFactory())
p1.show_info()

結果:

優點:

將使用者端與類的具體實現相分離每個工廠建立了一個完整的產品系列,使得易於交換產品系列有利於產品的一致性(及產品之間的約束關係)

缺點:

難以支援新種類的抽象產品

總結

到此這篇關於python工廠方法模式原理與實現的文章就介紹到這了,更多相關python工廠方法模式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com