python设计模式

16种设计模式

1.简单工厂模式

内容:不直接向客户端暴露对象创建的实现细节,而是通过一个工厂来负责创建产品类的实例

角色:
工厂角色(Creator)
抽象产品角色(Product)
具体产品角色(Concrete Product)

优点:
1.隐藏了对象创建的实现细节
2.客户端不需要修改代码

缺点:
1.违反了单一职责原则,将创建逻辑几种到一个工厂类里
2.当添加新产品时,需要修改工厂类代码,违反了开闭原则

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_huabeidef pay(self,money):if self.use_huabei:print("花呗支付%s元"%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:raise TypeError("No such payment named %s"%method)#client
pf=PaymentFactory()
p=pf.create_payment('huabei')
p.pay(100)

2.工厂方法模式

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_huabeidef pay(self,money):if self.use_huabei:print("花呗支付%s元"%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 WechatFactory(PaymentFactory):def create_payment(self):return WechatPay()class HuabeiFactory(PaymentFactory):def create_payment(self):return Alipay(use_huabei=True)#client
pf=WechatFactory()
p=pf.create_payment()
p.pay(100)

优点:
每个具体产品都对应一个具体工厂类,不需要修改工厂类代码
隐藏了对象创建的实现细节
缺点:
每增加一个具体产品类,就必须增加一个相应的具体工厂类,会增加很多代码,有点麻烦

3.抽象工厂模式

优点:
将客户端与类的具体实现相分离
每个工厂创建了一个完整的产品系列,使得易于交换产品系列
有利于产品的一致性(即产品之间的约束关系)
缺点:
难以支持新种类的(抽象)产品,比较复杂

from abc import ABCMeta,abstractmethod#------抽象产品------
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 MediaTekCPU()def 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(MiFactory())
#p1=make_phone(HuaweiFactory())
p1=make_phone(IPhoneFactory())
p1.show_info()

4.建造者模式

8.适配器模式

内容:将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

两种实现方式:
类适配器:使用多继承
对象适配器:使用组合

14.观察者模式

适用场景:
当一个抽象模型有两方面,其中一个方面依赖于另一个方面,将这两者封装再独立对象中以使它们可以各自独立地改变和复用
当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变
当一个对象必须通知其它对象,而它又不能假定其它对象是谁,换言之,你不希望这些对象是紧密耦合的

from abc import ABCMeta,abstractmethod
#抽象订阅者
class Observer(metaclass=ABCMeta):@abstractmethoddef update(self,notice):pass#抽象发布者
class Notice:def __init__(self):self.observers=[]def attach(self,obs):self.observers.append(obs)def detach(self,obs):self.observers.remove(obs)def notify(self):#推送for obs in self.observers:obs.update(self)#具体发布者
class StaffNotice(Notice):def __init__(self,company_info=None):super().__init__()self.__company_info=company_info@propertydef company_info(self):return self.__company_info@company_info.setterdef company_info(self,info):self.__company_info=infoself.notify()class Staff(Observer):def __init__(self):self.company_info=Nonedef update(self,notice):self.company_info=notice.company_infonotice=StaffNotice("初始公司信息")
s1=Staff()
s2=Staff()
notice.attach(s1)
notice.attach(s2)
notice.company_info="公司今年业绩非常好,给大家发奖金!!"
print(s1.company_info)
print(s2.company_info)
notice.detach(s2)
notice.company_info="公司明天放假"
print(s1.company_info)
print(s2.company_info)

优点:
1.目标和观察者直接的抽象耦合最小
2.支持广播通信

15.策略模式

内容:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化

角色:
抽象策略
具体策略
上下文

优点:
1.定义了一系列可重用的算法和行为
2.消除了一些条件语句
3.可以提供相同行为的不同实现

缺点:
客户必须了解不同的策略

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/17961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录一次通过iostat命令定位系统数据库CPU飙升的案例

一、背景 我们有个移动考勤的系统,运维监控系统显示,每到上下班时间,考勤数据库的CPU就飙升到100%,磁盘读写请求等待时间变长,最初无法确定是磁盘性能下降导致的CPU飙升,还是CPU飙升导致的磁盘性能下降&…

C# 外观模式

概述 外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式隐藏了子系统的复杂性,使得客户端可以通过简单的接口与子系统进行交互。 外观模式定义了一个高层…

设计模式之观察者模式

定义:对象间的一种一对多的依赖关系,当一个对象的状态发货所能改变时,所有依赖它的对象都得到通知并被自动更新。 例子:报纸-邮局-用户 不用设计模式实现 被观察者 package com.tao.YanMoDesignPattern.observer.case3_Origin;…

计算语言模型计算每秒钟生成的token数量it/s

在 main() 函数的stream循环中,我们可以计算每秒钟生成的token数量,然后输出 it/s。在流式生成过程中,我们可以使用Python的time模块来计算速度。在测试时,生成速度会受到多个因素的影响,包括设备性能、模型大小、输入…

Docker快速入门笔记

Docker快速入门 前言 当今软件开发领域的一股热潮正在迅速兴起,它融合了便捷性、灵活性和可移植性,让开发者们欣喜若狂。它就是 Docker!无论你是一个初学者,还是一位经验丰富的开发者,都不能错过这个引领技术浪潮的工…

基本不等式@平均值不等式@双勾函数不等式

文章目录 基本不等式基本齐次不等式一次形式👺基本不等式拓展拓展1拓展2 算数平均数和几何平均数不等式应用恒等变形 双勾函数不等式导数函数单调性🎈求解过程 极值点和极值函数单调性的简单证明🎈 基本不等式 基本齐次不等式 设 a , b ∈ …

windwos server 2008 更新环境,且vs_redis 安装失败

KB2919442 下载地址:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id42153 KB2919355 下载地址:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id42153 安装步骤:先安装442,后安装355

C语言打印水仙花数

“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=13+53+3^3,则153是一个“水仙花数”。 思路,先把每个数的每位算出来,然后再判断他们的3次方相加是否这个…

Ansible中常用的模块结合案例使用详解

Ansible中常用的模块结合案例使用详解 1. file模块2. copy模块3. yum_repository模块4. yum模块5. service模块6. systemd模块7. cron模块8. user模块9. group模块10. fetch模块11. get_url模块12. unarchive模块13. synchronize模块14. block模块15. parted模块16. firewalld模…

Linux ps命令:查看正在运行的进程

ps 命令是最常用的监控进程的命令,通过此命令可以查看系统中所有运行进程的详细信息。 ps 命令的基本格式如下: [rootlocalhost ~]# ps aux #查看系统中所有的进程,使用 BS 操作系统格式 [rootlocalhost ~]# ps -le #查看系统中所有的进程&am…

Vue中常用到的标签和指令

一、标签 在 Vue 中,并没有特定的标签是属于 Vue 的,因为 Vue 是一个用于构建用户界面的框架,可以与 HTML 标签一起使用。Vue 中可以使用的标签和元素基本上与 HTML 标准一致。 以下是一些常见的HTML标签,也可以在 Vue 中使用&a…

HTML+CSS+JavaScript:随机抽奖案例

一、需求 在时代少年团的七个人中,随机抽取一个人获得一等奖,再抽取一个获二等奖,再抽取一个获三等奖。注意同一个人不能同时获得多个奖项 如下图所示 二、代码素材 以下是缺失JS部分的代码,感兴趣的小伙伴可以先自己试着写一写…

oracle数据库dbLink的使用

Oracle的数据库链路(dbLink)是一种允许在两个不同的数据库实例之间进行通信和数据交换的功能。它可以让你在一个数据库中访问另一个数据库的对象和数据,就像它们属于同一个数据库一样。 创建一个link: CREATE public DATABASE LINK link_sco…

计算机网络用户接入层设计

用户接入层为用户提供访问核心网络的能力, 为用户提供共享/交换的带宽分配,按照业主要求,并考虑到端口密度的要求以及 设备的性能价格比,建议选用 Catalyst 3524XL和 Catalyst 3548XL 工作组交换 机,分别放置于配线间中。如同一配线间需两台以…

PyCharm安装使用2023年教程,PyCharm与现流行所有编辑器对比。

与PyCharm类似的功能和特性的集成开发环境(IDE)和代码编辑器有以下几种: Visual Studio Code(VS Code):由Microsoft开发,VS Code是一个高度可定制和可扩展的代码编辑器。它支持多种编程语言&am…

深入了解Redis-实战篇-短信登录

深入了解Redis-实战篇-短信登录 一、故事背景二、知识点主要构成2.1、短信登录2.1.1、生成随机短信验证码引入maven依赖生成验证码 2.1.2、实现登录校验拦截器2.1.3、基于Redis实现短信登录2.1.3.1、发送验证码时存入Redis2.1.3.2、登录时校验验证码 2.1.4、解决状态登录刷新的…

【phaser微信抖音小游戏开发006】给文本增加点击事件

新建st006,为文本增加点击事件。 我们加了一个计数的count,点击一次增加一下,并显示到屏幕上去。 效果如下图: 其它的对象以此类推即可,先置inputEnable为true,然后再增加一个inputDown事件即可。

Halcon学习之一维测量实战之测量矩形(一)

一、采集图像 (1)测量充电器 测量充电器的引脚,然后每次旋转充电器,让测量矩形都跟着它转,这就是定位+测量, (2)测量钥匙 (3)测量瓶盖 我们后面还会涉及到拟合的问

无涯教程-jQuery - css( properties )方法函数

css(properties)方法将键/值对象设置为所有匹配元素的样式属性。 css( properties ) - 语法 selector.css( properties ) 上面的语法可以写成如下- selector.css( {key1:val1, key2:val2....keyN:valN}) 这是此方法使用的所有参数的描述- key:value - 设置为样式属…

自动驾驶TPM技术杂谈 ———— 汽车转向系统术语和定义

文章目录 术语和定义基本术语转向系统转向参数转向系统形式转向车轮布置形式转向传动形式 功能安全术语 技术要求一般要求失效规定 试验方法汽车试验汽车转向系统完好时转向操纵力的测量汽车转向系统出现故障时转向操纵力的测量 挂车试验 附录转向圆试验功能安全概念安全分析 术…