最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2022年02月16日 11:36:52   作者:harder?work  
大家好,本篇文章主要講的是python工廠方法模式原理與實現(xiàn),感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下

一、簡介

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

在工廠模式中,我們在創(chuàng)建對象的過程中不會向客戶端暴露實現(xiàn)邏輯,而是通過一個共同的接口類來指向新創(chuàng)建的對象。

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

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

三、簡單工廠模式

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

具體代碼(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的一個元類,用于在Python程序中創(chuàng)建抽象基類,抽象基類中聲明的抽象方法,使用abstractmethod裝飾器裝飾。

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

優(yōu)點:

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

缺點:

違反了單一職責原則,將創(chuàng)建邏輯集中到一個工廠類里當添加新產(chǎn)品時,需要修改工廠類代碼,違反了開閉原則 

四、工廠模式

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

具體代碼(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)容:定義一個工廠類接口,讓工廠子類來創(chuàng)建一系列相關或者相互依賴的對象。

與工廠模式相比,抽象工廠模式中的每一個產(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("普通手機殼小手機殼")
 
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("聯(lián)發(fā)科CPU")
 
class AppleCPU(CPU):
    def show_cpu(self):
        print("蘋果CPU")
 
class AppleOS(OS):
    def show_os(self):
        print("蘋果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("手機信息:")
        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)點:

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

缺點:

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

總結(jié)

到此這篇關于python工廠方法模式原理與實現(xiàn)的文章就介紹到這了,更多相關python工廠方法模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python變量賦值機制踩坑記錄

    python變量賦值機制踩坑記錄

    這篇文章主要介紹了python變量賦值機制踩坑記錄,我們都知道python有深拷貝和淺拷貝,但變量賦值又是什么機制呢?這是個容易被忽略卻又極易踩坑的點,下面我們來一探究竟,需要的朋友可以參考一下
    2022-02-02
  • Python中l(wèi)ogging日志記錄到文件及自動分割的操作代碼

    Python中l(wèi)ogging日志記錄到文件及自動分割的操作代碼

    這篇文章主要介紹了Python中l(wèi)ogging日志記錄到文件及自動分割,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Python如何從列表中刪除相鄰和不相鄰的相同元素

    Python如何從列表中刪除相鄰和不相鄰的相同元素

    這篇文章主要介紹了Python如何從列表中刪除相鄰和不相鄰的相同元素問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python?tkinter自定義實現(xiàn)Expander控件

    python?tkinter自定義實現(xiàn)Expander控件

    和其他成熟的GUI庫相比,tkinter的組件并不是太多,但在自定義組件這一點上,并不遜色于其他框架,下面小編就教大家如何自定義一個Expander控件吧
    2023-08-08
  • 新手必備Python開發(fā)環(huán)境搭建教程

    新手必備Python開發(fā)環(huán)境搭建教程

    今天向大家介紹如何搭建Python開發(fā)環(huán)境, Python可應用于多平臺包括 Linux 和 Mac OS X,文中有非常詳細的圖文介紹,需要的朋友可以參考下
    2021-05-05
  • Python機器學習應用之基于決策樹算法的分類預測篇

    Python機器學習應用之基于決策樹算法的分類預測篇

    所謂決策樹,就是一個類似于流程圖的樹形結(jié)構,樹內(nèi)部的每一個節(jié)點代表的是對一個特征的測試,樹的分支代表該特征的每一個測試結(jié)果,而樹的每一個葉子節(jié)點代表一個類別。樹的最高層是就是根節(jié)點
    2022-01-01
  • 跟老齊學Python之玩轉(zhuǎn)字符串(2)更新篇

    跟老齊學Python之玩轉(zhuǎn)字符串(2)更新篇

    本文是玩轉(zhuǎn)字符串的續(xù)篇,繼續(xù)對字符串的連接方法進行介紹,以及字符串復制、字符串長度、字符大小寫的轉(zhuǎn)換。非常不錯的文章,希望對大家有所幫助
    2014-09-09
  • 淺談Python中chr、unichr、ord字符函數(shù)之間的對比

    淺談Python中chr、unichr、ord字符函數(shù)之間的對比

    chr、unichr、ord在Python中都可以被用作字符類型轉(zhuǎn)換,這里我們就來淺談Python中chr、unichr、ord字符函數(shù)之間的對比,需要的朋友可以參考下
    2016-06-06
  • django中path和url函數(shù)的具體使用

    django中path和url函數(shù)的具體使用

    本文主要介紹了django中path和url函數(shù)的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Python如何獲取多線程返回結(jié)果

    Python如何獲取多線程返回結(jié)果

    這篇文章主要介紹了Python如何獲取多線程返回結(jié)果,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評論

芒康县| 四川省| 巨鹿县| 彭阳县| 满城县| 和龙市| 全椒县| 舞阳县| 祁阳县| 开封县| 广德县| 包头市| 东光县| 仲巴县| 景泰县| 屯留县| 克什克腾旗| 罗甸县| 苍南县| 开封市| 克什克腾旗| 容城县| 宣恩县| 泽州县| 威海市| 临安市| 米林县| 五大连池市| 武安市| 察雅县| 四子王旗| 资阳市| 巴塘县| 玉田县| 错那县| 嵊泗县| 英德市| 南郑县| 金溪县| 理塘县| 天柱县|