python设计模式
0 前言
设计模式初衷是在实现业务后,采用设计模式对代码进行优化,提高代码效率,提高代码的可维护性和可扩展性,本质就是减弱面向对象中的类之间的依赖关系。
1. 单例模式
1.1 定义
- 确保某一个类中只有一个实例
- 可以实例化,并向整个类提供这个实例,这个类就叫做单例
- 单例模式是一种对象创建型模式
1.2.0 什么时候用单例
以后情况中的一种使用单例模式:
- 该类创建一个对象时会消耗大量的内存
- 该类的数据可以作为整个程序的全局变量
1.2 创建单例模式
1.2.1 最简单的构建方法–采用类方法
上述代码中的单例模式为伪单例模式。存在以下缺点:
- 必须利用getinstance方法才能实现单例,如果利用类名传入,如u3,则上述代码不为单例模式
- 在u1 u2时调用后,u1和u2的name都是zs,在u2创建时,类中已将存在zs的实例,直接返回zs的实例
1.2.2 最简单的构建方法-- 利用__new__方法
重写__new__方法,保证其只执行一次。
上述代码执行步骤:
创建u1和u2的步骤如下。u1 = User(’zs‘)时,会调用__new__方法在内存中创建一个对象,然后调用__intit方法对该对象的属性name进行赋值为’zs’,最后将u1指向这个对象。
调用u2 = User(’ls‘)时,调用__new__方法,由于已将存在实例,__new__方法会直接返回由u1指向的实例对象,然后调用__init__方法进行赋值’ls’操作,会将该实例对象的属性值name赋值为’ls’,最后将u2指向该实例对象。
综上,u1和u2都指向了同一个实例对象,实例对象的属性值为’ls’。
这种单例方法好处和缺点
- 优点:
解决了利用类方法getInstance的利用类名创建对象时的缺点 - 缺点
创建对象时采用object类的__new__时
创建出来的类不为单例,上述方法用的及其少。
因此,python中不能完成单例。
1.3 工厂模式
1.3.1 引言
- 是常见的实例化对象模式
- 本质是用工厂方法代替new操作的一种模式
- 缺点:会增加工作量
- 优点:会增加代码的扩展性;减少代码的修改量(增强可维护性)
- 采用第三方(工厂)减弱两个类之间的依赖关系实现对代码的优化
1.3.2 简单工厂模式
- 工厂中存在静态方法,并在类中采用类方法调用
- 工厂的作用根据一个类指定类型产生另一个类的对象。
- 两种方法:1.采用静态方法,如下;2. 采用全局函数方式(将工厂类的方法作为全局方法,减弱了面向对象的概念,很少用)
1.3.2 工厂方法模式
- 去掉了简单工厂模式的静态方法
- 将工厂定义为抽象类,将产生的类的定义为各种子类,重写工厂类中的方法。
- 直接在主类中调用工厂子类。
如下: