python设计模式(一)创建型模式
生活随笔
收集整理的這篇文章主要介紹了
python设计模式(一)创建型模式
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
創(chuàng)建型模式(5種):工廠方法模式、抽象工廠模式、創(chuàng)建者模式、原型模式、單例模式
https://www.bilibili.com/video/BV19541167cn?spm_id_from=333.999.0.0
1、面向?qū)ο?/h2>
"""
SOLID原則:- 開放封閉原則- 里氏替換原則- 依賴倒置原則- 接口隔離原則- 單一職責(zé)原則
"""
from abc import ABCMeta, abstractmethodclass Payment(metaclass=ABCMeta):# abstract class@abstractmethoddef pay(self, money):passclass Aipay(Payment):def pay(self, money):print('支付寶支付%d元.' % money)class WechatPay(Payment):def pay(self, money):print('微信支付%d元.' % money)p = Aipay()
p.pay(100)
2、簡單工廠模式(不屬于23種)
- 簡單工廠模式
- 內(nèi)容:不直接向客戶端暴露創(chuàng)建的實(shí)現(xiàn)細(xì)節(jié),而是通過一個工廠類來復(fù)制創(chuàng)建產(chǎn)品類的實(shí)現(xiàn)
- 角色:
- 工廠角色
- 抽象產(chǎn)品角色
- 具體產(chǎn)品角色
- 優(yōu)點(diǎn):
- 隱藏了對象創(chuàng)建的實(shí)現(xiàn)細(xì)節(jié)
- 客戶端不需要修改代碼
- 缺點(diǎn)
- 違反了單一職責(zé)原則,將創(chuàng)建邏輯集中到一個工廠類里
- 當(dāng)添加新廠品時,需要修改工廠類代碼,違反了開閉原則
from abc import ABCMeta, abstractmethodclass Payment(metaclass=ABCMeta):# abstract class@abstractmethoddef pay(self, money):passclass Alipay(Payment):def __init__(self, use_huabei=False):self.use_huabei = use_huabeidef pay(self, money):if self.use_huabei:print('花唄支付%d元.' % money)else:print("支付寶余額支付%d元" % money)class WechatPay(Payment):def pay(self, money):print('微信支付%d元.' % money)class PaymentFactory:def create_payment(self, method):if method == 'alipay':return Alipay()elif method == 'wechat':return WechatPay()elif method == 'huabei':return Alipay(use_huabei=True)else:return TypeError("No such payment named %s" % method)# client
pf = PaymentFactory()
p = pf.create_payment('huabei')
p.pay(100)
3、工廠方法模式
- 工廠方法模式
- 內(nèi)容:定義一個用于創(chuàng)建對象的接口(工廠接口),讓子類決定實(shí)例化哪一個產(chǎn)品類
- 角色:
- 抽象工廠角色
- 具體工廠角色
- 抽象產(chǎn)品角色
- 具體產(chǎn)品角色
- 優(yōu)點(diǎn):
- 每個具體產(chǎn)品都對應(yīng)一個具體工廠類,不需要修改工廠類代碼
- 隱藏了對象創(chuàng)建的實(shí)現(xiàn)細(xì)節(jié)
- 缺點(diǎn):
- 每增加一個具體類,就必須增加一個相應(yīng)的具體工廠類
from abc import ABCMeta, abstractmethodclass Payment(metaclass=ABCMeta):# abstract class@abstractmethoddef pay(self, money):passclass Alipay(Payment):def __init__(self, use_huabei=False):self.use_huabei = use_huabeidef pay(self, money):if self.use_huabei:print('花唄支付%d元.' % money)else:print("支付寶余額支付%d元" % money)class WechatPay(Payment):def pay(self, money):print('微信支付%d元.' % money)class PaymentFactory(metaclass=ABCMeta):@abstractmethoddef create_payment(self):passclass AlipayFactory(PaymentFactory):def create_payment(self):return Alipay()class WechatpayFactory(PaymentFactory):def create_payment(self):return WechatPay()class HuabeiFactory(PaymentFactory):def create_payment(self):return Alipay(use_huabei=True)pf = HuabeiFactory()
p = pf.create_payment()
p.pay(100)
4、抽象工廠模式
- 抽象工廠模式:
- 內(nèi)容:定義一個工廠類接口,讓工廠子類來創(chuàng)建一系列相關(guān)或相互依賴的對象
- 相比工廠方法模式,抽象工廠模式中的每個具體工廠都生產(chǎn)一套產(chǎn)品
- 角色:
- 抽象工廠角色
- 具體工廠角色
- 抽象產(chǎn)品角色
- 具體產(chǎn)品角色
5、建造者模式
- 建造者模式
- 內(nèi)容:將一個復(fù)雜對象的構(gòu)建與他的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示
- 角色:
- 抽象創(chuàng)建者
- 具體創(chuàng)建者
- 指揮者
- 產(chǎn)品
- 建造者模式和抽象工廠模式相似,也用來創(chuàng)建復(fù)雜對象,主要區(qū)別是建造者模式注重一步一步構(gòu)建一個
復(fù)雜對象,而抽象工廠模式注重多個系列的產(chǎn)品對象
from abc import ABCMeta, abstractmethodclass Player:def __init__(self, face=None, body=None, arm=None, leg=None):self.face = faceself.body = bodyself.arm = armself.leg = legdef __str__(self):return "%s %s %s %s" % (self.face, self.body, self.arm, self.leg)class PlayBuilder(metaclass=ABCMeta):@abstractmethoddef build_face(self):pass@abstractmethoddef build_body(self):pass@abstractmethoddef build_arm(self):pass@abstractmethoddef build_leg(self):passclass SexyGirlBuilder(PlayBuilder):def __init__(self):self.player = Player()def build_face(self):self.player.face = "臉蛋"def build_body(self):self.player.body = "苗條"def build_arm(self):self.player.arm = "胳膊"def build_leg(self):self.player.leg = "大長腿"class Monster(PlayBuilder):def __init__(self):self.player = Player()def build_face(self):self.player.face = "怪獸臉"def build_body(self):self.player.body = "怪獸身材"def build_arm(self):self.player.arm = "怪獸胳膊"def build_leg(self):self.player.leg = "怪獸腿"class PlayerDirector: # 控制組裝順序def build_player(self, builder):builder.build_body()builder.build_face()builder.build_arm()builder.build_leg()return builder.player# client
builder = SexyGirlBuilder()
director = PlayerDirector()
p = director.build_player(builder)
6、單例模式
- 單例模式
- 內(nèi)容:保證一個類只有一個實(shí)例,并提供一個訪問它的全局訪問點(diǎn)
- 角色:單例
- 優(yōu)點(diǎn):
- 對唯一實(shí)例的受控訪問
- 單例相當(dāng)于全局變量,但防止了命名空間被污染
class Singleton:def __new__(cls, *args, **kwargs):if not hasattr(cls, "_instance"):cls._instance = super(Singleton, cls).__new__(cls)return cls._instanceclass MyClass(Singleton):def __init__(self, a):self.a = aa = MyClass(10)
b = MyClass(20)
總結(jié)
- 內(nèi)容:不直接向客戶端暴露創(chuàng)建的實(shí)現(xiàn)細(xì)節(jié),而是通過一個工廠類來復(fù)制創(chuàng)建產(chǎn)品類的實(shí)現(xiàn)
- 角色:
- 工廠角色
- 抽象產(chǎn)品角色
- 具體產(chǎn)品角色
- 優(yōu)點(diǎn):
- 隱藏了對象創(chuàng)建的實(shí)現(xiàn)細(xì)節(jié)
- 客戶端不需要修改代碼
- 缺點(diǎn)
- 違反了單一職責(zé)原則,將創(chuàng)建邏輯集中到一個工廠類里
- 當(dāng)添加新廠品時,需要修改工廠類代碼,違反了開閉原則
- 內(nèi)容:定義一個用于創(chuàng)建對象的接口(工廠接口),讓子類決定實(shí)例化哪一個產(chǎn)品類
- 角色:
- 抽象工廠角色
- 具體工廠角色
- 抽象產(chǎn)品角色
- 具體產(chǎn)品角色
- 優(yōu)點(diǎn):
- 每個具體產(chǎn)品都對應(yīng)一個具體工廠類,不需要修改工廠類代碼
- 隱藏了對象創(chuàng)建的實(shí)現(xiàn)細(xì)節(jié)
- 缺點(diǎn):
- 每增加一個具體類,就必須增加一個相應(yīng)的具體工廠類
- 內(nèi)容:定義一個工廠類接口,讓工廠子類來創(chuàng)建一系列相關(guān)或相互依賴的對象
- 相比工廠方法模式,抽象工廠模式中的每個具體工廠都生產(chǎn)一套產(chǎn)品
- 角色:
- 抽象工廠角色
- 具體工廠角色
- 抽象產(chǎn)品角色
- 具體產(chǎn)品角色
- 內(nèi)容:將一個復(fù)雜對象的構(gòu)建與他的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示
- 角色:
- 抽象創(chuàng)建者
- 具體創(chuàng)建者
- 指揮者
- 產(chǎn)品
- 建造者模式和抽象工廠模式相似,也用來創(chuàng)建復(fù)雜對象,主要區(qū)別是建造者模式注重一步一步構(gòu)建一個
復(fù)雜對象,而抽象工廠模式注重多個系列的產(chǎn)品對象
- 內(nèi)容:保證一個類只有一個實(shí)例,并提供一個訪問它的全局訪問點(diǎn)
- 角色:單例
- 優(yōu)點(diǎn):
- 對唯一實(shí)例的受控訪問
- 單例相當(dāng)于全局變量,但防止了命名空間被污染
以上是生活随笔為你收集整理的python设计模式(一)创建型模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 精选(63) 面试官:说一下的 dub
- 下一篇: python自动生成和读取word_使用