日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【设计模式·Python】创建型模式

發布時間:2023/12/8 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【设计模式·Python】创建型模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

設計模式中,創建型模式主要由以下幾種:

  • 工廠方法模式
  • 抽象工廠模式
  • 建造者模式
  • 原型模式
  • 單例模式

簡單工廠模式

  • 不直接向客戶暴露對象的實現細節,而是通過一個工廠類來負責創建產品的實例。
  • 角色:
    工廠角色(Creator)
    抽象產品角色(Product)
    具體產品角色(Concrete Product)
# class Payment: # def pay(self, money): # raise NotImplementedErrorfrom 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:@staticmethoddef create_payment(method):if method == 'alipay':return Alipay()elif method == 'huabei':return Alipay(use_huabei=True)elif method == 'wechat':return WechatPay()else:raise TypeError("No such payment named %s" % method)# client pf = PaymentFactory() pm = pf.create_payment('huabei') pm.pay(300)

工廠方法模式

  • 定義一個用于創建對象的接口(工廠接口),讓子類決定實例化哪一個產品類。
  • 角色:
    抽象工廠角色(Creator)
    具體工廠角色(Concrete Creator)
    抽象產品角色(Product)
    具體產品角色(Contrete Product)
# class Payment: # def pay(self, money): # raise NotImplementedErrorfrom 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 YinlianPay(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 WechatFactory(PaymentFactory):def create_payment(self):return WechatPay()class HuabeiFactory(PaymentFactory):def create_payment(self):return Alipay(use_huabei=True)class YinlianFactory(PaymentFactory):def create_payment(self):return YinlianPay()# client pf = YinlianFactory() pm = pf.create_payment() pm.pay(300)

抽象工廠模式:

  • 定義一個工廠類接口,讓工廠子類來創建一系列相關或相互依賴的對象。
  • 相比工廠方法模式,抽象工廠模式中每個具體的工廠都生產一套產品。
from abc import abstractmethod, ABCMeta# --- 抽象產品 class PhoneShell(metaclass=ABCMeta):@abstractmethoddef show_shell(self):passclass CPU(metaclass=ABCMeta):@abstractmethoddef show_cpu(self):passclass OS(metaclass=ABCMeta):@abstractmethoddef show_os(self):pass# ---- 抽象工廠 class Phone_Factory(metaclass=ABCMeta):@abstractmethoddef make_shell(self):pass@abstractmethoddef make_cpu(self):pass@abstractmethoddef make_os(self):pass# ---- 具體產品 class SmallShell(PhoneShell):def show_shell(self):print("普通手機小手機殼")class BigShell(PhoneShell):def show_shell(self):print("普通手機大手機殼")class AplShell(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 AplCPU(CPU):def show_cpu(self):print("蘋果CPU")class AndrodOS(OS):def show_os(self):print("安卓系統")class AplOS(OS):def show_os(self):print("IOS")# ---- 具體工廠 class IPhoneFactory(Phone_Factory):def make_shell(self):return AplShell()def make_cpu(self):return AplCPU()def make_os(self):return AplOS()# ---- 客戶端 class Phone:def __init__(self, cpu, os, shell):self.cpu = cpuself.os = osself.shell = shelldef 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)phone = make_phone(IPhoneFactory()) phone.show_info()

建造者模式:

  • 將一個復雜對象的構建與他的表示分離,使得同樣的構建過程可以創建不同的表示

  • 角色:
    抽象建造者(Builder)
    具體建造者(Concrete Builder)
    指揮者(Director)
    產品(Product)

  • 建造者模式與抽象工程模式相似,也用來創建復雜對象。主要區別是建造者模式著重一步步構造一個復雜對象,

  • 而抽象工廠模式著重于多個系列的產品對象。

# 建造者模式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 PlayerBuilder(metaclass=ABCMeta):@abstractmethoddef build_face(self):pass@abstractmethoddef build_body(self):pass@abstractmethoddef build_arm(self):pass@abstractmethoddef build_leg(self):passclass SexyGirlBuilder(PlayerBuilder):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 MonsterBuilder(PlayerBuilder):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 = MonsterBuilder() director = PlayerDirector() p = director.build_player(builder) print(p)

單例模式:

  • 保證一個類只有一個實例,并提供一個訪問他的全局訪問點。
# 單例模式 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) print(a) b = Myclass(20) print(b) print(a.a) print(id(a), id(b))

總結

以上是生活随笔為你收集整理的【设计模式·Python】创建型模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。