python设计模式--读书笔记
2024-09-24 01:39:08
GoF在其设计模式一书中提出了23种设计模式,并将其分为三类:
- 创建型模式
将对象创建的细节隔离开来,代码与所创建的对象的类型无关。
- 结构型模式
简化结构,识别类与对象间的关系,重点关注类的继承和组合。
- 行为型模式
关注对象间的交互以及对象间的响应性。
单例设计模式
- 确保类只有一个对象被创建
- 为对象提供一个全局都可以访问的入口
- 控制共享资源的并发访问
1 简单实现:
通过覆盖__new__方法来控制对象的创建。
class Singleton(object):
def __new__(cls):
if not hasattr(cls, 'instance'):
cls.instance = super(Singleton, cls).__new__(cls)
return cls.instance s1 = Singelton()
s2 = Singleton()
更进一步,可以改写成:
class HealthCheck:
_instance = None
def __new__(cls, *args, **kwargs):
if not HealthCheck._instance:
HealthCheck._instance = super(HealthCheck, cls).__new__(cls, *args, **kwargs)
return HealthCheck._instance def __init__(self):
self.servers = []
def do1(self):
pass
def do2(self):
pass
2 python元类
实例化对象时,该类所继承的元类的__call__方法控制着该过程。
class MetaSingleton(type):
_instance = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instance:
cls._instance[cls] = super(MetaSingleton, cls).__call__(*args, **kwargs)
return cls._instance class Logger(metaclass = MetaSingleton):
pass logger1 = Logger()
logger2 = Logger()
工厂模式
简单工厂模式
工厂方法模式
抽象工厂模式
代理模式
- 为其他对象提供了一个代理,从而实现了对原始对象的访问控制。
- 相当于增加了一个层或接口。增加了安全性。
- 代理模式与装饰器不同,后者是在原有对象上动态的添加新的行为;而前者是在程序编译时完成的,旨在控制外界对被代理对象的访问。
class Actor(object):
def __init__(self):
self.isBusy = False def occupied(self):
self.isBusy = True
print(type(self).__name__, "is occupied with current movie") def available(self):
self.isBusy = False
print(type(self).__name__, "is free for the movie") def getStatus(self):
return self.isBusy class Agent(object):
def __init__(self):
self.principal = None def __work(self):
self.actor = Actor()
if self.actor.getStatus():
self.actor.occupied()
else:
self.available() if __name__ == '__main__':
r = Agent()
r.work()
代理的分类:
- 虚拟代理
- 远程代理
- 保护代理
- 智能代理
最新文章
- jQuery初始化加载的实现
- [转] ServletContext 与application的异同
- Mysql数据库操作系统及配置参数优化
- ThinkPHP3.2.3 的异常和错误屏蔽处理
- fedora终端快捷键
- encodeURIComponent编码后java后台的解码
- js 重载i
- Linux操作杂记
- macro names must be identifiers
- Java多线程:常用的实现多线程的两种方式
- SQL 修改排序规则的问题 sql_latin1_general_cp1_ci_as
- Tcp Socket非阻塞recv
- 第二十六节,Python内置函数
- 用自定义注解实现fastjson序列化的扩展
- Socket与WebScoket
- 全面解密QQ红包技术方案:架构、技术实现、移动端优化、创新玩法等
- Maven 项目 无缘无故报错:版本冲突,其他机器上正常-提交的时候报冲突怎么也解决不掉
- gcc centos 新版本的安装方法
- eclipse 出现内存溢出问题解决办法
- IDEA2017-破解方法
热门文章
- Spring框架总结(六)
- 一句话说说java设计模式
- 编写高质量代码改善C#程序的157个建议——建议129:泛型类型参数要以T作为前缀
- Alpha冲刺 - (8/10)
- HBASE与hive对比使用以及HBASE常用shell操作。与sqoop的集成
- CodeForces 907F Power Tower(扩展欧拉定理)
- 从源码角度看Transaction以及如何手工接管Transaction实现高度的自定义化
- MVVM ICommand.CanExecute parameter is null
- sqlite初识
- python学习之路 二 :基本数据类型