设计模式一:创建型模式
知识储备:
1.接口:若干抽象方法的集合
作用:限制实现接口的类必须按照接口给定的调用方式实现这些方法;对高层模块隐藏了类的内部实现。
2.面向对象设计SOLID原则
- 开放封闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
- 里氏替换原则:所有引用父类的地方必须能透明的使用其子类的对象。
- 依赖倒置原则:高层模块不应该依赖底层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程。
- 接口隔离原则:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
- 单一职责原则:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责某一项职责。
3.设计模式分类
创建型模式(5种):工厂方法模式、抽象工厂模式、创建者模式、原型模式、单例模式
结构型模式(7种):适配器模式、桥模式、组合模式、装饰模式、外观模式、享元模式、代理模式
行为型模式(11种):解释器模式、责任链模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、访问者模式、模板方法模式
1、简单工厂模式
内容:不直接向客户端暴露对象创建的实现细节,而是通过一个工厂类来负责创建产品类的实例。
角色:
- 工厂角色(Creator)
- 抽象产品角色(Product)
- 具体产品角色(Concrete Product)
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_hubei = use_huabeidef pay(self, money):if self.use_hubei:print("花呗支付%d元" % money)else:print("支付宝余额支付%d" % money)class Wechat(Payment):def pay(self, money):print("微信支付%d元" % money)# 工厂类 class PaymentFactory:def create_payment(self, method):if method == 'alipay':return Alipay()elif method == 'wechat':return Wechat()elif method == 'huabei':return Alipay(use_huabei=True)else:raise TypeError("No such payment named %s" % method)# client pf = PaymentFactory() p = pf.create_payment('huabei') p.pay(100)## 工厂角色: PaymentFactory 抽象产品角色:Payment 具体产品角色:Alipay,WechatPay
View Code
优点:
1.隐藏了对象创建的实现细节
2.客户端不需要修改代码
缺点:
1.违反了单一职责原则,将创建逻辑集中到一个工厂类里
2.当添加新产品时,需要修改工厂类代码,违反了开闭原则
2、工厂方法模式
内容:定义一个用于创建对象的接口(工厂接口),让子类决定实例化哪一个产品类。
角色:
- 抽象工厂角色(Creator)
- 具体工厂角色(Concrete Cretor)
- 抽象产品角色(Product)
- 具体产品角色(Concrete Product)
from abc import ABCMeta, abstractmethodclass Payment(metaclass=ABCMeta):@abstractmethoddef pay(self, money):passclass PaymentFactory(metaclass=ABCMeta):@abstractmethoddef create_payment(self):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 Wechat(Payment):def pay(self, money):print("微信支付%d元" %money)class AlipayFactory(PaymentFactory):def create_payment(self):return Alipay()class WechatPayFactory(PaymentFactory):def create_payment(self):return Wechat()# clientpf = AlipayFactory() p = pf.create_payment() p.pay(100)##抽象工厂角色:PaymentFactory具体工厂角色:AliFactory,WechatFactory抽象产品角色:Payment具体产品角色:AliPay,WechatPay
View Code
优点:
1.每个产品都对应一个具体工厂类,不需要修改修改共产类代码
2.隐藏了对象创建的实现细节
缺点:
1.每增加一个具体产品类,就必须增加一个相应的具体工厂类
3、抽象工厂模式
内容:定义一个工厂类接口,让工厂子类来创建一系列相关或相互依赖的对象。
例:生产一部手机,需要手机壳、CPU、操作系统三类对象进行组装,其中每类都有不同的种类。对每个具体工厂,分别生产一部手机所需要的三个对象。
相比工厂方法模式,抽象工厂模式中的每个具体工厂都生产一套产品。
角色:
- 抽象工厂角色(Creator)
- 具体工厂角色(Concrete Cretor)
- 抽象产品角色(Product)
- 具体产品角色(Concrete Product)
- 客户端(Client)
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 PhoneFactory(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 AppleShell(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 AppleCPU(CPU):def show_cpu(self):print("苹果CPU")class Android(OS):def show_os(self):print("Android系统")class IOS(OS):def show_os(self):print("iOS系统")# ------具体工厂------class MiFactory(PhoneFactory):def make_cpu(self):return SnapDragonCPU()def make_os(self):return Android()def make_shell(self):return BigShell()class HuaweiFactory(PhoneFactory):def make_cpu(self):return MediaTekCPUdef make_os(self):return Android()def make_shell(self):return SmallShell()class IPhoneFactory(PhoneFactory):def make_cpu(self):return AppleCPU()def make_os(self):return IOS()def make_shell(self):return AppleShell()# ------客户端------class Phone:def __init__(self, cpu, os, shell):self.cpu = cpuself.os = osself.shell = shelldef 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)p1 = make_phone(IPhoneFactory()) p1.show_info()
View Code
优点:
1.将客户端与类的具体实现相分离
2.每个工厂创建了一个完整的产品系列,使得易于交换产品系列
3.有利于产品一致性(即产品之间的约束关系)
缺点:
1.难以支持新种类的(抽象)产品
4、创建者模式
内容:将一个复杂对象的构造与它的表示分离,使得同样的构建过程可以创建不同的表示。
角色:
- 抽象建造者(Builder)
- 具体建造者(Concrete Builder)
- 指挥者(Director)
- 产品(Product)
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 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 Monster(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# clientbuilder = Monster() director = PlayerDirector() p = director.build_player(builder) print(p)##抽象建造者:PlayerBuilder具体建造者:SexyGirlBuilder, Monster指挥者:PlayerDirector产品:p
View Code
建造者模式与抽象工厂模式类似,也用来创建复杂对象。主要区别是建造者模式着重一步步构造一个复杂对象,而抽象工厂模式着重于多个系列的产品对象。
优点:
1.隐藏了一个产品的内部结构和装配过程
2.将构造代码与表示代码分开
3.可以对构造过程更精细的控制
5、单例模式
内容:保证一个类只有一个实例,并提供一个访问它的全局访问点
角色:
- 单例
优点:
1.对唯一实例的受控访问
2.单例相当于全局变量,但防止了命名空间被污染。
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)print(a.a) print(b.a) print(id(a), id(b))
View Code
## 创建型模式小结 1、抽象工厂模式和建造者模式相比于简单工厂模式和工厂方法模式而言更灵活也更复杂。 2、通常情况下,设计以简单工厂模式或工厂方法模式开始,当你发现设计需要更大的灵活性时,则像更复杂的设计模式演化。
转载于:https://www.cnblogs.com/Xuuuuuu/p/10856870.html
设计模式一:创建型模式相关推荐
- java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...
23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...
- Java学习--设计模式之创建型模式
一.简介 创建型模式:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象.这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活.创建型模式包括:工 ...
- 备战面试日记(3.2) - (设计模式.23种设计模式之创建型模式)
本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.6 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...
- 设计模式之创建型模式(工厂、原型、建造者)
文章目录 创建型模式 2.1 工厂设计模式 2.1.1 简单工厂模式 2.1.2 工厂方法模式 2.1.3 抽象工厂 2.1.4 工厂模式总结 2.1.5 Spring中的工厂模式 2.1.6 工作中 ...
- GOF23设计模式(创建型模式)工厂模式
目录: 一:工厂模式的核心本质 二:关于面向对象的六大基本原则 三:工厂模式的三大类详解(代码示例,详细分析) 首先,上咱本GOF23所有工厂模式的分类表格!!! 创建型模式 单例模式.工厂模式.抽象 ...
- 设计模式之创建型模式
2019独角兽企业重金招聘Python工程师标准>>> 随着对软件工程研究的不断深入,设计模式也越来越多了,根据其目的准则,划分如下: 1. 创建型:creational 与对象的创 ...
- 设计模式6——创建型模式之原型模式
定义:原型模式(Prototype Pattern),用原型模式指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 类型:创建型模式. 类图: 参与角色: CPrototype,抽象原型基类,提供 ...
- 设计模式1—创建型模式
模式 在一定环境中解决某一问题的方案,包括三个基本元素--问题,解决方案和环境. 大白话:在一定环境下,用固定套路解决问题. 设计模式(Design pattern ...
- 创建型模式、结构型模式和行为型模式_设计模式之创建型模式
设计模式GOF23(Group of Four) 设计模式可分为三种类型: 创建型模式:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式. 结构型模式:适配器模式,桥接模式,装饰模式,组合模式, ...
- GoF的23种设计模式之创建型模式的特点和分类
创建型模式的主要关注点是"怎样创建对象?",它的主要特点是"将对象的创建与使用分离".这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关 ...
最新文章
- Linux Linux程序练习十一(网络编程大文件发送UDP版)
- Pandas中Apply函数加速百倍的技巧
- 计算机组成原理访问失效,北京科技大学2013年硕士学位研究生入学考试试题(计算机组成原理)...
- ndarray.shape[]返回值的意义
- 通道注意力新突破!从频域角度出发,浙大提出FcaNet:仅需修改一行代码,简洁又高效
- hadoop 伪分布模式
- liferay 如何在页面实现添加多个portlet
- SHT知识库操作要点
- 快手通过标签添加的我_快手内容运营技巧:快手创作者如何蹭热点?快速上热门...
- Ogre:ManualObject
- 数据结构笔记(三十三)--二叉排序树的插入与生成
- CGAffineTransformMakeRotation 实现旋转
- 手把手教你protel 99se 入门
- 下载网页或者微信公众号中视频的方法详细介绍
- java导出CSV文件
- 二维码如何制作?简单的制作方法介绍
- 深层学习:心智如何超越经验3.1 创造性问题
- 免费范文网复制内容-百味书屋
- 深度学习:隐马尔科夫模型
- 究竟怎样写代码才算是好代码