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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python常用设计模式—创建型模式

發(fā)布時(shí)間:2023/12/8 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python常用设计模式—创建型模式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一、簡(jiǎn)單工廠模式
  • 二、工廠方法模式
  • 三、抽象工廠模式
  • 四、建造者模型
  • 五、單例模式
  • 六、創(chuàng)建型模式概述


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

簡(jiǎn)單工廠模式不是23中設(shè)計(jì)模式中的,但是必須要知道。簡(jiǎn)單工廠模式不直接向客戶端暴露對(duì)象創(chuàng)建的細(xì)節(jié),而是通過一個(gè)工廠類來負(fù)責(zé)創(chuàng)建產(chǎn)品類的實(shí)例。簡(jiǎn)單工程模式的角色有:工廠角色、抽象產(chǎn)品角色、具體產(chǎn)品角色,通過例子來加深理解:

from abc import ABCMeta, abstractmethod# 抽象產(chǎn)品角色,以什么樣的表現(xiàn)去使用 class Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):pass# 產(chǎn)品角色 class Alipay(Payment):def __init__(self, use_huabei=False):self.use_huabei = use_huabeidef pay(self, money):if self.use_huabei == True:print("花唄支付了{(lán)0}元!".format(money))else:print("支付寶余額支付了{(lán)0}元!".format(money))# 產(chǎn)品角色 class WechatPay(Payment):def pay(self, money):print("微信支付了%d元!" % (money))# 工廠類角色 class PaymentFactory:def ctreate_payment(self, method):if method == 'Alipay':return Alipay()elif method == 'WechatPay':return WechatPay()elif method == 'HuabeiPay':return Alipay(use_huabei=True)else:raise TypeError('No such payment named %s' % method)# 客戶端調(diào)用。不直接向客戶端暴露對(duì)象創(chuàng)建的實(shí)現(xiàn)細(xì)節(jié),而是通過一個(gè)工廠類來負(fù)責(zé)創(chuàng)建產(chǎn)品類的實(shí)例 pf = PaymentFactory() p = pf.ctreate_payment('HuabeiPay') p.pay(100)

二、工廠方法模式

簡(jiǎn)單工廠模式只創(chuàng)建一個(gè)工廠類,當(dāng)有新的產(chǎn)品時(shí),需要修改工廠類代碼。而 工廠方法模式的每個(gè)具體產(chǎn)品對(duì)應(yīng)一個(gè)具體的工廠類,不需要修改工廠類代碼,并且同時(shí)也能滿足隱藏對(duì)象創(chuàng)建的細(xì)節(jié)。但是工廠方法模式也是有缺點(diǎn)的,就是 每增加一個(gè)具體產(chǎn)品類,就必須增加一個(gè)相應(yīng)的具體方法。 工廠模式方法模式的概念是定義了一個(gè)用于創(chuàng)建對(duì)象的接口(工廠接口),讓子類決定實(shí)例化那一個(gè)產(chǎn)品類。角色有抽象工廠角色、具體工廠角色、抽象產(chǎn)品角色和具體產(chǎn)品角色。通過例子來加深理解,每個(gè)具體產(chǎn)品對(duì)應(yīng)一個(gè)具體的工廠類:

from abc import ABCMeta, abstractmethod# 抽象產(chǎn)品角色 class Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):pass# 具體產(chǎn)品角色 class Alipay(Payment):def __init__(self, use_huabei=False):self.use_huabei = use_huabeidef pay(self, money):if self.use_huabei == True:print("花唄支付了{(lán)0}元!".format(money))else:print("支付寶余額支付了{(lán)0}元!".format(money))class WechatPay(Payment):def pay(self, money):print("微信支付了%d元!" % (money))# 抽象工廠角色 class PaymentFactory(metaclass=ABCMeta):@abstractmethoddef create_payment(self):pass# 具體工廠角色 class AlipayFactory(PaymentFactory):def create_payment(self):return Alipay()class WechatPayFactory(PaymentFactory):def create_payment(self):return Alipay()class HuabeiFactory(PaymentFactory):def create_payment(self):return Alipay(use_huabei=True)hfp = HuabeiFactory().create_payment() hfp.pay(100) # 花唄支付了100元!

缺點(diǎn)是每增加一個(gè)具體產(chǎn)品類,就必須增加一個(gè)相應(yīng)的具體方法:

from abc import ABCMeta, abstractmethodclass Payment(metaclass=ABCMeta):@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 == True:print("花唄支付了{(lán)0}元!".format(money))else:print("支付寶余額支付了{(lán)0}元!".format(money))class WechatPay(Payment):def pay(self, money):print("微信支付了%d元!" % (money))class BankPay(Payment):def pay(self, money):print("銀行支付了%d元!" % (money))# 創(chuàng)建產(chǎn)品的工廠類的接口 class PaymentFactory(metaclass=ABCMeta):@abstractmethoddef create_payment(self):pass# 工廠類 class AlipayFactory(PaymentFactory):def create_payment(self):return Alipay()# 工廠類 class WechatPayPayFactory(PaymentFactory):def create_payment(self):return Alipay()# 工廠類 class HuabeiPayFactory(PaymentFactory):def create_payment(self):return Alipay(use_huabei=True)# 新增加銀行支付的工廠類 class BankPayFactory(PaymentFactory):def create_payment(self):return BankPay()bfp = BankPayFactory().create_payment() bfp.pay(100) # 銀行支付了100元!

三、抽象工廠模式

抽象工廠模式:定義一個(gè)工廠類的接口讓工廠子類來創(chuàng)建一系列相關(guān)或者相互依賴的對(duì)象。相比工廠方法模式,抽象工廠模式中的每一個(gè)具體工廠都生產(chǎn)一套產(chǎn)品。下面是生產(chǎn)廠商生產(chǎn)一部手機(jī)的例子:生產(chǎn)一部手機(jī)如果說只需要手機(jī)殼、CPU和操作系統(tǒng)這三個(gè)類對(duì)象,其中每個(gè)類對(duì)象都有不同的種類。對(duì)每個(gè)具體工廠,分別生產(chǎn)一部手機(jī)需要的三個(gè)對(duì)象。通過例子來加深理解:

from abc import ABCMeta, abstractmethod# ------抽象的產(chǎn)品------ class PhoneShell(metaclass=ABCMeta):@abstractmethoddef show_shell(self):passclass PhoneCPU(metaclass=ABCMeta):@abstractmethoddef show_cpu(self):passclass PhoneOS(metaclass=ABCMeta):@abstractmethoddef show_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('蘋果手機(jī)殼')class SnapDragonCPU(PhoneCPU):def show_cpu(self):print('驍龍CPU')class HuaweiCPU(PhoneCPU):def show_cpu(self):print('化為CPU')class AppleCPU(PhoneCPU):def show_cpu(self):print('蘋果CPU')class AndroidOS(PhoneOS):def show_os(self):print('IOS系統(tǒng)')class AppleOS(PhoneOS):def show_os(self):print('安卓系統(tǒng)')# ------抽象的工廠------ class PhoneFactory(metaclass=ABCMeta):@abstractmethoddef make_shell(self):pass@abstractmethoddef make_cpu(self):pass@abstractmethoddef make_os(self):pass# ------具體的工廠------ class HuaweiFactory(PhoneFactory):def make_shell(self):return SmallShell()def make_cpu(self):return HuaweiCPU()def make_os(self):return AndroidOS()class AppleFactory(PhoneFactory):def make_shell(self):return AppleShell()def make_cpu(self):return AppleCPU()def make_os(self):return AppleOS()# ------客戶端------ class Phone:def __init__(self, shell, cpu, os):self.shell = shellself.cpu = cpuself.os = osdef show_info(self):print('手機(jī)信息:')self.shell.show_shell()self.cpu.show_cpu()self.os.show_os()def make_phone(factory):shell = factory.make_shell()cpu = factory.make_cpu()os = factory.make_os()return Phone(shell, cpu, os)p = make_phone(HuaweiFactory()) p.show_info() """ 手機(jī)信息: 普通手機(jī)小手機(jī)殼 化為CPU IOS系統(tǒng) """

抽象工廠模式的角色有:抽象工廠角色、具體工廠角色、抽象產(chǎn)品角色、具體產(chǎn)品角色和客戶端。抽象工廠模式的優(yōu)點(diǎn)是:將客戶端和類的具體實(shí)現(xiàn)相分離;每個(gè)工廠創(chuàng)建了一個(gè)完整的產(chǎn)品系列,使得易于交換產(chǎn)品系列;有利于產(chǎn)品的一致性,即產(chǎn)品之間的約束關(guān)系。缺點(diǎn)是:難以支持新種類抽象產(chǎn)品


四、建造者模型

建造者模式是將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。角色有抽象創(chuàng)建者、具體創(chuàng)建者、指揮者和產(chǎn)品。建造者模式與抽象工廠模式相似,也用來創(chuàng)建復(fù)雜的對(duì)象。主要區(qū)別是 建造者模式著重一步步構(gòu)造一個(gè)復(fù)雜對(duì)象(控制順序)。而抽象工廠模式著重于多個(gè)系列的產(chǎn)品對(duì)象,寫個(gè)例子來加強(qiáng)理解:

from abc import ABCMeta, abstractmethod# ------產(chǎn)品------ class Player:def __init__(self, face=None, body=None, arms=None, legs=None):self.face = faceself.body = bodyself.arms = armsself.legs = legsdef __str__(self):return '%s,%s,%s,%s' % (self.face, self.body, self.arms, self.legs)# ------抽象建造者------ class PlayerBuilder(metaclass=ABCMeta):@abstractmethoddef build_face(self):pass@abstractmethoddef build_body(self):pass@abstractmethoddef build_arms(self):pass@abstractmethoddef build_legs(self):pass# ------具體建造者,隱藏了一個(gè)產(chǎn)品的內(nèi)部結(jié)構(gòu)------ class GirlBuilder(PlayerBuilder):def __init__(self):self.player = Player()def build_face(self):self.player.face = '漂亮的臉蛋'def build_body(self):self.player.body = '苗條的身材'def build_arms(self):self.player.arms = '細(xì)細(xì)的胳膊'def build_legs(self):self.player.legs = '大長(zhǎng)腿'# ------具體建造者,表示代碼------ 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_arms(self):self.player.arms = '粗壯的胳膊'def build_legs(self):self.player.legs = '粗壯的大腿'# ------指揮者,構(gòu)造代碼(構(gòu)造代碼和表示代碼分開),可以對(duì)構(gòu)造過程進(jìn)行更加精細(xì)地控制------ class PlayerDirectory():def builder_player(self, builder):"""隱藏了裝配過程:param builder::return:"""builder.build_face()builder.build_body()builder.build_arms()builder.build_legs()return builder.player# ------客戶端------ builder = GirlBuilder() director = PlayerDirectory() p = director.builder_player(builder) print(p) # 漂亮的臉蛋,苗條的身材,細(xì)細(xì)的胳膊,大長(zhǎng)腿

五、單例模式

單例模式保證一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。優(yōu)點(diǎn)是對(duì)唯一實(shí)例的受控訪問(只有一個(gè)實(shí)例),單例相當(dāng)于全局變量,但防止了命名空間被污染(變量命名不會(huì)有沖突)。寫個(gè)例子來加深理解:

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 = ams1 = MyClass(1) ms2 = MyClass(2) print(ms1.a, ms2.a) print(id(ms1), id(ms2)) """ 2 2 139843914173312 139843914173312 """

如果實(shí)例只出現(xiàn)一次,如日志系統(tǒng)中只需要?jiǎng)?chuàng)建一個(gè)日志對(duì)象(否則兩個(gè)日志對(duì)象同時(shí)操作一個(gè)文件就會(huì)造成操作沖突);數(shù)據(jù)庫(kù)連接池只需要?jiǎng)?chuàng)建一個(gè)對(duì)象來操作數(shù)據(jù)庫(kù)(否則增加系統(tǒng)開銷,浪費(fèi)系統(tǒng)資源);操作系統(tǒng)只需要?jiǎng)?chuàng)建一個(gè)文件系統(tǒng)對(duì)象來操作文件系統(tǒng)。


六、創(chuàng)建型模式概述

抽象工廠模式和建造者模式相比于簡(jiǎn)單工廠模式和工廠方法模式而言更加靈活也更加復(fù)雜。通常情況下,軟件設(shè)計(jì)以簡(jiǎn)單工廠模式或工廠方法模式開始,當(dāng)發(fā)現(xiàn)設(shè)計(jì)需要更大的靈活性的時(shí)候,則向更加復(fù)雜的設(shè)計(jì)模式演化。

總結(jié)

以上是生活随笔為你收集整理的Python常用设计模式—创建型模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。