文章目录

  • 一、简单工厂模式
  • 二、工厂方法模式
  • 三、抽象工厂模式
  • 四、建造者模型
  • 五、单例模式
  • 六、创建型模式概述

一、简单工厂模式

简单工厂模式不是23中设计模式中的,但是必须要知道。简单工厂模式不直接向客户端暴露对象创建的细节,而是通过一个工厂类来负责创建产品类的实例。简单工程模式的角色有:工厂角色、抽象产品角色、具体产品角色,通过例子来加深理解:

from abc import ABCMeta, abstractmethod# 抽象产品角色,以什么样的表现去使用
class Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):pass# 产品角色
class Alipay(Payment):def __init__(self, use_huabei=False):self.use_huabei = use_huabeidef pay(self, money):if self.use_huabei == True:print("花呗支付了{0}元!".format(money))else:print("支付宝余额支付了{0}元!".format(money))# 产品角色
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)# 客户端调用。不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例
pf = PaymentFactory()
p = pf.ctreate_payment('HuabeiPay')
p.pay(100)

二、工厂方法模式

简单工厂模式只创建一个工厂类,当有新的产品时,需要修改工厂类代码。而 工厂方法模式的每个具体产品对应一个具体的工厂类,不需要修改工厂类代码,并且同时也能满足隐藏对象创建的细节。但是工厂方法模式也是有缺点的,就是 每增加一个具体产品类,就必须增加一个相应的具体方法。 工厂模式方法模式的概念是定义了一个用于创建对象的接口(工厂接口),让子类决定实例化那一个产品类。角色有抽象工厂角色、具体工厂角色、抽象产品角色和具体产品角色。通过例子来加深理解,每个具体产品对应一个具体的工厂类:

from abc import ABCMeta, abstractmethod# 抽象产品角色
class Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):pass# 具体产品角色
class Alipay(Payment):def __init__(self, use_huabei=False):self.use_huabei = use_huabeidef pay(self, money):if self.use_huabei == True:print("花呗支付了{0}元!".format(money))else:print("支付宝余额支付了{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元!

缺点是每增加一个具体产品类,就必须增加一个相应的具体方法:

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("花呗支付了{0}元!".format(money))else:print("支付宝余额支付了{0}元!".format(money))class WechatPay(Payment):def pay(self, money):print("微信支付了%d元!" % (money))class BankPay(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 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元!

三、抽象工厂模式

抽象工厂模式:定义一个工厂类的接口让工厂子类来创建一系列相关或者相互依赖的对象。相比工厂方法模式,抽象工厂模式中的每一个具体工厂都生产一套产品。下面是生产厂商生产一部手机的例子:生产一部手机如果说只需要手机壳、CPU和操作系统这三个类对象,其中每个类对象都有不同的种类。对每个具体工厂,分别生产一部手机需要的三个对象。通过例子来加深理解:

from abc import ABCMeta, abstractmethod# ------抽象的产品------
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# ------具体的产品------
class SmallShell(PhoneShell):def show_shell(self):print('普通手机小手机壳')class BigShell(PhoneShell):def show_shell(self):print('普通手机大手机壳')class AppleShell(PhoneShell):def show_shell(self):print('苹果手机壳')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系统')class AppleOS(PhoneOS):def show_os(self):print('安卓系统')# ------抽象的工厂------
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('手机信息:')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()
"""
手机信息:
普通手机小手机壳
化为CPU
IOS系统
"""

抽象工厂模式的角色有:抽象工厂角色、具体工厂角色、抽象产品角色、具体产品角色和客户端。抽象工厂模式的优点是:将客户端和类的具体实现相分离;每个工厂创建了一个完整的产品系列,使得易于交换产品系列;有利于产品的一致性,即产品之间的约束关系。缺点是:难以支持新种类抽象产品


四、建造者模型

建造者模式是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。角色有抽象创建者、具体创建者、指挥者和产品。建造者模式与抽象工厂模式相似,也用来创建复杂的对象。主要区别是 建造者模式着重一步步构造一个复杂对象(控制顺序)。而抽象工厂模式着重于多个系列的产品对象,写个例子来加强理解:

from abc import ABCMeta, abstractmethod# ------产品------
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# ------具体建造者,隐藏了一个产品的内部结构------
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 = '细细的胳膊'def build_legs(self):self.player.legs = '大长腿'# ------具体建造者,表示代码------
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 = '粗壮的大腿'# ------指挥者,构造代码(构造代码和表示代码分开),可以对构造过程进行更加精细地控制------
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)  # 漂亮的脸蛋,苗条的身材,细细的胳膊,大长腿

五、单例模式

单例模式保证一个类只有一个实例,并提供一个访问它的全局访问点。优点是对唯一实例的受控访问(只有一个实例),单例相当于全局变量,但防止了命名空间被污染(变量命名不会有冲突)。写个例子来加深理解:

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
"""

如果实例只出现一次,如日志系统中只需要创建一个日志对象(否则两个日志对象同时操作一个文件就会造成操作冲突);数据库连接池只需要创建一个对象来操作数据库(否则增加系统开销,浪费系统资源);操作系统只需要创建一个文件系统对象来操作文件系统。


六、创建型模式概述

抽象工厂模式和建造者模式相比于简单工厂模式和工厂方法模式而言更加灵活也更加复杂。通常情况下,软件设计以简单工厂模式或工厂方法模式开始,当发现设计需要更大的灵活性的时候,则向更加复杂的设计模式演化。

Python常用设计模式—创建型模式相关推荐

  1. 七大设计原则与设计模式(创建型模式、结构型模式、行为型模式)

    七大设计原则 开闭原则.依赖倒置原则.单一职责原则.接口隔离原则.迪米特法则(最少知道原则).里氏替换原则.合成 (组合).聚合复用原则 开闭原则 定义: 一个软件实体如类.模块和函数应该对扩展开放, ...

  2. 设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript

    设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript 简单工厂模式 定义一个接口,三个具体类.然后书写如下,通过选择,生产出相应的对象 // 定义Shape接口 interface Sh ...

  3. 设计模式-创建型模式-建造者模式

    设计模式-创建型模式-建造者模式 建造者模式即生成器模式,将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 代码如下 // 产品类 public class Product{pu ...

  4. 设计模式-创建型模式-模板方法

    设计模式-创建型模式-模板方法 定义一个操作中的算法框架,将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义一个算法的步骤. protected 对于本包及其子类可见. 类图 代码 代 ...

  5. 设计模式-创建型模式-工厂模式(工厂三兄弟)

    设计模式-创建型模式-工厂模式(工厂三兄弟) 工厂模式分为简单工厂,工厂方法,抽象工厂. 简单工厂模式 一个接口,三个具体类,一个工厂,通过选择,生产出对应的对象. package demo2;pub ...

  6. 设计模式-创建型模式-抽象工厂模式

    工程源码:设计模式-创建型模式-抽象工厂模式https://download.csdn.net/download/qq_40788199/85544119 码云:设计模式-创建型模式-抽象工厂模式ht ...

  7. 设计模式-创建型模式-简单工厂模式

    工程地址:设计模式-简单工厂源码-C++文档类资源-CSDN下载C++设计模式-创建型模式-简单工厂模式源码更多下载资源.学习资料请访问CSDN下载频道.https://download.csdn.n ...

  8. 设计模式-创建型模式-工厂方法模式

    工程源码:c++设计模式-创建型模式-工厂方法模式https://download.csdn.net/download/qq_40788199/85541617 码云:https://gitee.co ...

  9. 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern。

    设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. 文章目录 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. eg. 简单工厂模式. 结构. 优 ...

最新文章

  1. 打印出所有的中文字符
  2. 数据库将某个字段由可为空改为非空
  3. 【redis】redis实现API接口调用调用次数的限制
  4. yolov5论文叫什么_论文格式与论文查重到底是什么鬼?教你半小时搞定的独门技巧...
  5. opencv 星空_opencv各种小例子
  6. 踩坑记录:请求接口status返回0
  7. PopTheBubble —测量媒体偏差的产品创意
  8. LintCode刷题——打劫房屋I、II、III
  9. Linux缺少rz和sz命令
  10. 极大似然估计法(Maximum likelihood estimation, MLE)
  11. TeX Live安装教程
  12. linux怎么限制文件大小,Linux文件系统文件大小限制
  13. find命令查找包含指定内容的文件
  14. Andriod studio 学习 之 Recyclerview
  15. FL Studio20.9DAW宿主电子音乐制作软件
  16. 界面控件DevExpress WinForms皮肤编辑器的这个补丁,你了解了吗?
  17. c语言中测长度的函数,c读入文本后,用strlen函数测不出正确长度
  18. 互联网早报:腾讯推出“微小号”,用虚拟手机号拨打电话收发短信
  19. 蓝牙耳机优点在哪儿?2021哪个牌子蓝牙耳机音质好?
  20. S5PV210 GPIO驱动及其在android2.3.1下jni调用

热门文章

  1. Unity3D优化总结
  2. java里jvm,jer,jdk的区别
  3. 我的世界网易版服务器文件,我的世界网易版服务器怎么加材质包-我的世界网易版服务器如何加材质包...
  4. DOTS介绍+Unity DOTS-MAN小游戏项目实战
  5. Maven 自己下载依赖包安装到本地仓库
  6. OR-CAD CAPTURE学习笔记——ERROR(ORCAP-11010)
  7. apple IDP 个人账户升级到公司账户(转)
  8. 冬天来了,春天还远吗
  9. 打开计算机任务栏有桌面没,电脑桌面任务栏图标_电脑打开后没有任何显示(只有桌面)图标,任务栏都没有....
  10. 为内部业务系统(LOB)使用Exchange Online发送匿名邮件