创建型模式(5种):工厂方法模式、抽象工厂模式、创建者模式、原型模式、单例模式

https://www.bilibili.com/video/BV19541167cn?spm_id_from=333.999.0.0

1、面向对象

"""
SOLID原则:- 开放封闭原则- 里氏替换原则- 依赖倒置原则- 接口隔离原则- 单一职责原则
"""
from abc import ABCMeta, abstractmethodclass Payment(metaclass=ABCMeta):# abstract class@abstractmethoddef pay(self, money):passclass Aipay(Payment):def pay(self, money):print('支付宝支付%d元.' % money)class WechatPay(Payment):def pay(self, money):print('微信支付%d元.' % money)p = Aipay()
p.pay(100)

2、简单工厂模式(不属于23种)

  • 简单工厂模式

    • 内容:不直接向客户端暴露创建的实现细节,而是通过一个工厂类来复制创建产品类的实现
    • 角色:
      • 工厂角色
      • 抽象产品角色
      • 具体产品角色
    • 优点:
      • 隐藏了对象创建的实现细节
      • 客户端不需要修改代码
    • 缺点
      • 违反了单一职责原则,将创建逻辑集中到一个工厂类里
      • 当添加新厂品时,需要修改工厂类代码,违反了开闭原则
from 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:def create_payment(self, method):if method == 'alipay':return Alipay()elif method == 'wechat':return WechatPay()elif method == 'huabei':return Alipay(use_huabei=True)else:return TypeError("No such payment named %s" % method)# client
pf = PaymentFactory()
p = pf.create_payment('huabei')
p.pay(100)

3、工厂方法模式

  • 工厂方法模式

    • 内容:定义一个用于创建对象的接口(工厂接口),让子类决定实例化哪一个产品类
    • 角色:
      • 抽象工厂角色
      • 具体工厂角色
      • 抽象产品角色
      • 具体产品角色
    • 优点:
      • 每个具体产品都对应一个具体工厂类,不需要修改工厂类代码
      • 隐藏了对象创建的实现细节
    • 缺点:
      • 每增加一个具体类,就必须增加一个相应的具体工厂类
from 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(metaclass=ABCMeta):@abstractmethoddef create_payment(self):passclass AlipayFactory(PaymentFactory):def create_payment(self):return Alipay()class WechatpayFactory(PaymentFactory):def create_payment(self):return WechatPay()class HuabeiFactory(PaymentFactory):def create_payment(self):return Alipay(use_huabei=True)pf = HuabeiFactory()
p = pf.create_payment()
p.pay(100)

4、抽象工厂模式

  • 抽象工厂模式:

    • 内容:定义一个工厂类接口,让工厂子类来创建一系列相关或相互依赖的对象
    • 相比工厂方法模式,抽象工厂模式中的每个具体工厂都生产一套产品
    • 角色:
      • 抽象工厂角色
      • 具体工厂角色
      • 抽象产品角色
      • 具体产品角色

5、建造者模式

  • 建造者模式

    • 内容:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示
    • 角色:
      • 抽象创建者
      • 具体创建者
      • 指挥者
      • 产品
    • 建造者模式和抽象工厂模式相似,也用来创建复杂对象,主要区别是建造者模式注重一步一步构建一个
      复杂对象,而抽象工厂模式注重多个系列的产品对象
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 PlayBuilder(metaclass=ABCMeta):@abstractmethoddef build_face(self):pass@abstractmethoddef build_body(self):pass@abstractmethoddef build_arm(self):pass@abstractmethoddef build_leg(self):passclass SexyGirlBuilder(PlayBuilder):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 Monster(PlayBuilder):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 = SexyGirlBuilder()
director = PlayerDirector()
p = director.build_player(builder)

6、单例模式

  • 单例模式

    • 内容:保证一个类只有一个实例,并提供一个访问它的全局访问点
    • 角色:单例
    • 优点:
      • 对唯一实例的受控访问
      • 单例相当于全局变量,但防止了命名空间被污染
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)
b = MyClass(20)

python设计模式(一)创建型模式相关推荐

  1. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

  2. Java学习--设计模式之创建型模式

    一.简介 创建型模式:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象.这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活.创建型模式包括:工 ...

  3. 备战面试日记(3.2) - (设计模式.23种设计模式之创建型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.6 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  4. 设计模式之创建型模式(工厂、原型、建造者)

    文章目录 创建型模式 2.1 工厂设计模式 2.1.1 简单工厂模式 2.1.2 工厂方法模式 2.1.3 抽象工厂 2.1.4 工厂模式总结 2.1.5 Spring中的工厂模式 2.1.6 工作中 ...

  5. 设计模式之创建型模式

    2019独角兽企业重金招聘Python工程师标准>>> 随着对软件工程研究的不断深入,设计模式也越来越多了,根据其目的准则,划分如下: 1. 创建型:creational 与对象的创 ...

  6. GOF23设计模式(创建型模式)工厂模式

    目录: 一:工厂模式的核心本质 二:关于面向对象的六大基本原则 三:工厂模式的三大类详解(代码示例,详细分析) 首先,上咱本GOF23所有工厂模式的分类表格!!! 创建型模式 单例模式.工厂模式.抽象 ...

  7. 设计模式6——创建型模式之原型模式

    定义:原型模式(Prototype Pattern),用原型模式指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 类型:创建型模式. 类图: 参与角色: CPrototype,抽象原型基类,提供 ...

  8. 设计模式1—创建型模式

    模式          在一定环境中解决某一问题的方案,包括三个基本元素--问题,解决方案和环境.          大白话:在一定环境下,用固定套路解决问题. 设计模式(Design pattern ...

  9. 创建型模式、结构型模式和行为型模式_设计模式之创建型模式

    设计模式GOF23(Group of Four) 设计模式可分为三种类型: 创建型模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式. 结构型模式:适配器模式,桥接模式,装饰模式,组合模式, ...

  10. GoF的23种设计模式之创建型模式的特点和分类

    创建型模式的主要关注点是"怎样创建对象?",它的主要特点是"将对象的创建与使用分离".这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关 ...

最新文章

  1. Chrome之排序问题
  2. scikit-learn:通过Non-negative matrix factorization (NMF or NNMF)实现LSA(隐含语义分析)...
  3. 初入C++(一) c++中的一些基础和与c的一些区别
  4. 统计.html,分类统计.html
  5. php结构的项目,ThinkPHP修改项目结构
  6. 中科院分区 计算机科学与技术专业就业前景,2020年中科院分区(升级版)最新数据分析...
  7. igraph基本用法
  8. open_source_team
  9. sqrt函数,对数进行开根号
  10. Python 和matlab 关于DMD(动态模态分解)的实现和对比 21/06/08
  11. EDA(Quartus II)——乐曲硬件演奏电路设计
  12. Java-Stream流,异常捕获
  13. 多小波分解2-D图像
  14. 使用java发送Infor XA ERP SystemLink请求
  15. 写给java web一年左右工作经验的人
  16. 高数上册第七章小结笔记
  17. office 2010安装
  18. 指数移动平均(EMA)的原理及PyTorch实现
  19. Linux账户标识R=400是什么意思_linux系统安装软件注意事项 @叼毛一个
  20. 人工智能:第四章 机器学习之聚类

热门文章

  1. 测绘程序设计实习 CSU
  2. vSphere 通过 vMotion 实现虚拟机热迁移
  3. linux驱动开发之内核线程
  4. P2404 自然数的拆分问题 回溯
  5. 李宏毅 Attention
  6. P3644 [APIO2015]八邻旁之桥(中位数、堆)
  7. 互联网产品上线前,做些什么——产品、开发、测试的视角
  8. 解决Beyond Compare中文乱码问题
  9. 12月29日--Java中有关类与对象的学习记录
  10. Computing Trajectory Similarity in Linear Time: A Generic Seed-Guided Neural Metric Learning Appr...