创建模式小结:
创建型模式小结:
抽象工厂, 建造者模式 相比于 简单工厂模式 和 工厂方法 模式 更加灵活,也更加复杂;
实践中: 先从 设计 简单工厂模式开始, 或工厂方法模式开始;
当自己已经熟练掌握 这种方法时, 并且 当设计需要更大的灵活性时, 开始向后续的设计模式演化;
定义: 单例模式
内容: 保证一个类 只有一个实例, 并提供一个访问他的全局访问点;
角色: 单例 singleton
一、new(cls, *args, **kwargs) 方法特性
new(cls,*agrs,**kwargs):在类调用init方法时,new方法决定是否要用init方法,因为new可以调用其他类的方法,或者返回别的对象来作为本类的实例;
• new()方法的特性:
• new()方法时在类准备将自身实例化时调用;
• new()方法始终都是类的静态方法,即使没有被加上静态方法装饰器
二、使用步骤
1.高层代码
代码如下:
from abc import abstractmethod, ABCMeta
class Student:
def __new__(cls, *args, **kwargs):
print("执行__new__",args[0],args[1]);
return object.__new__(cls);#固定语法
def __init__(self,name,age):
print("执行__init__",name,age);
self.name=name;
self.age=age;
def showName(self):
print("姓名:{}".format(self.name));
zhangsan=Student("张三",22);
zhangsan.showName();
class Singleton:
def __new__(cls, *args, **kwargs):
if not hasattr(cls, "_instance"):
cls._instance = super(Singleton, cls).__new__(cls)
return cls._instance
class MyClass(Singleton):
def __init__(self, a):
self.a = a
2.高层代码
代码如下(示例):
t1 = MyClass(10)
print( t1.a, id(t1))
t2 = MyClass(20)
print(t1.a)
print(t2.a)
print(id(t1), id(t2))
总结
优点:
- 对唯一实例的受控访问;
- 单例 相当于 全局变量, 防止了命名空间被污染;