日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

python工廠方法模式原理與實(shí)現(xiàn)_python

作者:harder?work ? 更新時(shí)間: 2022-04-21 編程語(yǔ)言

一、簡(jiǎn)介

工廠模式是屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。

在工廠模式中,我們?cè)趧?chuàng)建對(duì)象的過(guò)程中不會(huì)向客戶端暴露實(shí)現(xiàn)邏輯,而是通過(guò)一個(gè)共同的接口類(lèi)來(lái)指向新創(chuàng)建的對(duì)象。

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

抽象工廠(Abstract Factory):提供了創(chuàng)建產(chǎn)品的接口,調(diào)用者通過(guò)它訪問(wèn)具體工廠的工廠方法newProduct()來(lái)創(chuàng)建產(chǎn)品。
具體工廠(ConcreteFactory):主要實(shí)現(xiàn)抽象工廠中的抽象方法,完成具體產(chǎn)品的創(chuàng)建。
抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能。
具體產(chǎn)品(ConcreteProduct):實(shí)現(xiàn)了抽象產(chǎn)品定義的接口,由具體工廠來(lái)創(chuàng)建,它同具體工廠之間一一對(duì)應(yīng)。

三、簡(jiǎn)單工廠模式

內(nèi)容:不直接向客戶端暴露對(duì)象創(chuàng)建實(shí)現(xiàn)的細(xì)節(jié),而是通過(guò)工廠類(lèi)來(lái)負(fù)責(zé)創(chuàng)建產(chǎn)品類(lèi)的實(shí)例。

具體代碼(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)

結(jié)果:

ABCMeta是python的一個(gè)元類(lèi),用于在Python程序中創(chuàng)建抽象基類(lèi),抽象基類(lèi)中聲明的抽象方法,使用abstractmethod裝飾器裝飾。

簡(jiǎn)單明了的說(shuō):創(chuàng)建一個(gè)公共的抽象類(lèi),然后創(chuàng)建多個(gè)支付的類(lèi)繼承這個(gè)抽象類(lèi),各種支付類(lèi)里實(shí)現(xiàn)具體的支付方式,通過(guò)工廠類(lèi)選擇支付方式,這樣客服端只實(shí)現(xiàn)支付方式,不需要知道具體的實(shí)現(xiàn)方法。

優(yōu)點(diǎn):

隱藏了對(duì)象創(chuàng)建的實(shí)現(xiàn)細(xì)節(jié)客戶端不需要修改代碼

缺點(diǎn):

違反了單一職責(zé)原則,將創(chuàng)建邏輯集中到一個(gè)工廠類(lèi)里當(dāng)添加新產(chǎn)品時(shí),需要修改工廠類(lèi)代碼,違反了開(kāi)閉原則?

四、工廠模式

內(nèi)容:定義了一個(gè)用于創(chuàng)建對(duì)象的接口(工廠類(lèi)),讓工廠子類(lèi)決定實(shí)例化哪一個(gè)產(chǎn)品類(lèi)。

具體代碼(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)

結(jié)果:

五、抽象工廠模式

?內(nèi)容:定義一個(gè)工廠類(lèi)接口,讓工廠子類(lèi)來(lái)創(chuàng)建一系列相關(guān)或者相互依賴(lài)的對(duì)象。

與工廠模式相比,抽象工廠模式中的每一個(gè)產(chǎn)品都生產(chǎn)一套產(chǎn)品。

具體代碼(abstract_factory.py):

from abc import ABCMeta, abstractmethod
"""
抽象產(chǎn)品
"""
 
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
 
# 具體產(chǎn)品
class SmallShell(PhoneShell):
    def show_shell(self):
        print("普通手機(jī)殼小手機(jī)殼")
 
class BigShell(PhoneShell):
    def show_shell(self):
        print("普通手機(jī)殼大手機(jī)殼")
 
class AppleShell(PhoneShell):
    def show_shell(self):
        print("蘋(píng)果手機(jī)殼")
 
class SnapDragonCPU(CPU):
    def show_cpu(self):
        print("驍龍CPU")
 
class MediaTekCPU(CPU):
    def show_cpu(self):
        print("聯(lián)發(fā)科CPU")
 
class AppleCPU(CPU):
    def show_cpu(self):
        print("蘋(píng)果CPU")
 
class AppleOS(OS):
    def show_os(self):
        print("蘋(píng)果OS系統(tǒng)")
 
class AndroidOS(OS):
    def show_os(self):
        print("Android系統(tǒng)")
 
class IOS(OS):
    def show_os(self):
        print("IOS系統(tǒng)")
 
# 具體工廠
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("手機(jī)信息:")
        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()

結(jié)果:

優(yōu)點(diǎn):

將客戶端與類(lèi)的具體實(shí)現(xiàn)相分離每個(gè)工廠創(chuàng)建了一個(gè)完整的產(chǎn)品系列,使得易于交換產(chǎn)品系列有利于產(chǎn)品的一致性(及產(chǎn)品之間的約束關(guān)系)

缺點(diǎn):

難以支持新種類(lèi)的抽象產(chǎn)品

總結(jié)

原文鏈接:https://blog.csdn.net/qq_45758854/article/details/122956626

欄目分類(lèi)
最近更新