python设计模式--读书笔记
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()
代理的分类:
- 虚拟代理
- 远程代理
- 保护代理
- 智能代理
python设计模式--读书笔记的更多相关文章
- HeadFirst设计模式读书笔记--目录
HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...
- Head First 设计模式读书笔记(1)-策略模式
一.策略模式的定义 策略模式定义了算法族,分别封装起来,让它们之间可以互换替换,此模式让算法的变化独立使用算法的客户. 二.使用策略模式的一个例子 2.1引出问题 某公司做了一套模拟鸭子的游戏:该游戏 ...
- JavaScript设计模式:读书笔记(未完)
该篇随我读书的进度持续更新阅读书目:<JavaScript设计模式> 2016/3/30 2016/3/31 2016/4/8 2016/3/30: 模式是一种可复用的解决方案,可用于解决 ...
- Head First 设计模式读书笔记
在网上学习了一段时间设计模式,总感觉不系统,很容易忘,最近买书,学习了<Head First设计模式>,受益匪浅,特做此记录,以便激励自己不断的向后学习. 原书JAVA版本,本次学习记录及 ...
- <代码整洁之道>、<java与模式>、<head first设计模式>读书笔记集合
一.前言 几个月前的看书笔记 ...
- head first 设计模式读书笔记 之 策略模式
作为一个php开发者,深知曾经很多程序员都鄙视php,为什么呢?因为他们认为php的语法是dirty的,并且由于开发者水平参差不齐导致php的代码更加乱上加乱,维护起来简直一坨shit一样.随着php ...
- 《流畅的python》读书笔记
流畅的python 第1章 python数据模型 ---1.1 一摞Python风格的纸牌 特殊方法,即__method__,又被称为魔术方法(magic method)或者双下方法(dunder-m ...
- JavaScript设计模式 -- 读书笔记
JavaScript设计模式 一. 设计模式 一个模式就是一个可重用的方案: 有效的解决方法.易重用.善于表达该解决方案: 未通过"模式特性"测试的模式称为模式原型: 三规则:适用 ...
- Python cookbook - 读书笔记
Before: python built-in function: docs 我只想学function map(), THIS - 摘: map(foo, seq) is equivalent to ...
随机推荐
- SecondaryNameNode中的“Inconsistent checkpoint fields”错误原因
该错误原因,可能是因为没有设置好SecondaryNameNode上core-site.xml文件中的"hadoop.tmp.dir". 2014-04-17 11:42:18,1 ...
- strerror线程安全分析
导读 strerror是否线程安全了? 1 errno是否线程安全? 1 附1:strerror源码 2 附2:__strerror_r源码 2 strerror是否线程安全了? 答案是NO,但它有个 ...
- schedule-pool模拟并行任务分片
模拟并行任务分片 代码部分: package com.pool; import com.alibaba.fastjson.JSON; import java.io.BufferedReader; im ...
- sublime Text2常见插件介绍
zen coding 一种快速编写HTML/CSS代码的方法,已改名为Emmet,并且搭建了一个新的网站:docs.emmet.io Sublime Text 2安装插件Emmet后,打开sublim ...
- Label下FormattedText中的Span无法使用Binding的解决方法
在Xamarin.Forms中,Xaml的模板功能并没有原生WPF丰富,比如Label中虽然有FormattedText可以添加Span来丰富Label的功能,但是下面的Span中的Text并没有绑定 ...
- Replication--发布属性immediate_sync
在创建发布时,如果选择立即初始化,会将immediate_sync属性设置为true.如果immediate_sync属性为true时,snapshot文件和发布事务及发布命令将一直保留到指定的事务保 ...
- 解决centOS 本地可以访问 外部主机不能访问的问题
但是centos中的防火墙规则比较严密 用curl http://localhost:10000 可以看到内容,但是外部无法访问,原因是防火墙没有开启10000端口,需要将10000端口加入到信任规则 ...
- .Net Core内存回收模式及性能测试对比
.NET Core 两种GC模式: Server GC / Workstation GC Server GC : 主要应用于多处理器系统,并且作为ASP.NET Core宿主的默认配置.它会为每个处理 ...
- documeant 学习总结(二)
(一)移除节点及属性 /**移除节点和属性的操作 * @throws DocumentException */ public void RemoveOperator() ...
- 微信小程序的onLaunch()方法和onShow()方法
在app.js里面你会发现一个onLaunch()方法,这个方法是当小程序加载完毕后就执行的方法,此外,还有一个onShow()方法,先看下面的代码 app.js //app.js App({ onL ...