设计模式中,创建型模式主要由以下几种:
# class Payment:
# def pay(self, money):
# raise NotImplementedError
from abc import ABCMeta, abstractmethod
class Payment(metaclass=ABCMeta):
# abstract class
@abstractmethod
def pay(self, money):
pass
class 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:
@staticmethod
def 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)
# class Payment:
# def pay(self, money):
# raise NotImplementedError
from abc import ABCMeta, abstractmethod
class Payment(metaclass=ABCMeta):
# abstract class
@abstractmethod
def pay(self, money):
pass
class 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):
@abstractmethod
def create_payment(self):
pass
class 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):
@abstractmethod
def show_shell(self):
pass
class CPU(metaclass=ABCMeta):
@abstractmethod
def show_cpu(self):
pass
class OS(metaclass=ABCMeta):
@abstractmethod
def show_os(self):
pass
# ---- 抽象工厂
class Phone_Factory(metaclass=ABCMeta):
@abstractmethod
def make_shell(self):
pass
@abstractmethod
def make_cpu(self):
pass
@abstractmethod
def 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 = 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)
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 = face
self.body = body
self.arm = arm
self.leg = leg
def __str__(self):
return "%s, %s, %s, %s" %(self.face, self.body, self.arm, self.leg)
class PlayerBuilder(metaclass=ABCMeta):
@abstractmethod
def build_face(self):
pass
@abstractmethod
def build_body(self):
pass
@abstractmethod
def build_arm(self):
pass
@abstractmethod
def build_leg(self):
pass
class 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._instance
class Myclass(Singleton):
def __init__(self, a):
self.a = a
a = Myclass(10)
print(a)
b = Myclass(20)
print(b)
print(a.a)
print(id(a), id(b))
因篇幅问题不能全部显示,请点此查看更多更全内容