生活随笔
收集整理的這篇文章主要介紹了
【设计模式·Python】创建型模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
設計模式中,創建型模式主要由以下幾種:
- 工廠方法模式
- 抽象工廠模式
- 建造者模式
- 原型模式
- 單例模式
簡單工廠模式
- 不直接向客戶暴露對象的實現細節,而是通過一個工廠類來負責創建產品的實例。
- 角色:
工廠角色(Creator)
抽象產品角色(Product)
具體產品角色(Concrete Product)
from abc
import ABCMeta
, abstractmethod
class Payment(metaclass
=ABCMeta
):@abstractmethoddef pay(self
, money
):passclass Alipay(Payment
):def __init__(self
, use_huabei
=False):self
.use_huabei
= use_huabei
def 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
)
pf
= PaymentFactory
()
pm
= pf
.create_payment
('huabei')
pm
.pay
(300)
工廠方法模式
- 定義一個用于創建對象的接口(工廠接口),讓子類決定實例化哪一個產品類。
- 角色:
抽象工廠角色(Creator)
具體工廠角色(Concrete Creator)
抽象產品角色(Product)
具體產品角色(Contrete Product)
from abc
import ABCMeta
, abstractmethod
class Payment(metaclass
=ABCMeta
):@abstractmethoddef pay(self
, money
):passclass Alipay(Payment
):def __init__(self
, use_huabei
=False):self
.use_huabei
= use_huabei
def 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
()
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
= 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
)phone
= make_phone
(IPhoneFactory
())
phone
.show_info
()
建造者模式:
-
將一個復雜對象的構建與他的表示分離,使得同樣的構建過程可以創建不同的表示
-
角色:
抽象建造者(Builder)
具體建造者(Concrete Builder)
指揮者(Director)
產品(Product)
-
建造者模式與抽象工程模式相似,也用來創建復雜對象。主要區別是建造者模式著重一步步構造一個復雜對象,
-
而抽象工廠模式著重于多個系列的產品對象。
from abc
import ABCMeta
, abstractmethod
class Player:def __init__(self
, face
=None, body
=None, arm
=None, leg
=None):self
.face
= faceself
.body
= bodyself
.arm
= armself
.leg
= leg
def __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
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
._instance
class 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】创建型模式的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。