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()

代理的分类:

  • 虚拟代理
  • 远程代理
  • 保护代理
  • 智能代理

最新文章

  1. jQuery初始化加载的实现
  2. [转] ServletContext 与application的异同
  3. Mysql数据库操作系统及配置参数优化
  4. ThinkPHP3.2.3 的异常和错误屏蔽处理
  5. fedora终端快捷键
  6. encodeURIComponent编码后java后台的解码
  7. js 重载i
  8. Linux操作杂记
  9. macro names must be identifiers
  10. Java多线程:常用的实现多线程的两种方式
  11. SQL 修改排序规则的问题 sql_latin1_general_cp1_ci_as
  12. Tcp Socket非阻塞recv
  13. 第二十六节,Python内置函数
  14. 用自定义注解实现fastjson序列化的扩展
  15. Socket与WebScoket
  16. 全面解密QQ红包技术方案:架构、技术实现、移动端优化、创新玩法等
  17. Maven 项目 无缘无故报错:版本冲突,其他机器上正常-提交的时候报冲突怎么也解决不掉
  18. gcc centos 新版本的安装方法
  19. eclipse 出现内存溢出问题解决办法
  20. IDEA2017-破解方法

热门文章

  1. Spring框架总结(六)
  2. 一句话说说java设计模式
  3. 编写高质量代码改善C#程序的157个建议——建议129:泛型类型参数要以T作为前缀
  4. Alpha冲刺 - (8/10)
  5. HBASE与hive对比使用以及HBASE常用shell操作。与sqoop的集成
  6. CodeForces 907F Power Tower(扩展欧拉定理)
  7. 从源码角度看Transaction以及如何手工接管Transaction实现高度的自定义化
  8. MVVM ICommand.CanExecute parameter is null
  9. sqlite初识
  10. python学习之路 二 :基本数据类型