# 设计模式之创建型模式
工厂模式
解决对象创建问题
解耦对象的创建和使用
包括工厂方法和抽象工厂
class DogToy:
def speak(self):
print ("wang wang")
class CatToy:
def speak(self):
print ("miao miao")
def toy_factory(toy_type):
if toy_type == 'dog':
return DogToy()
elif toy_type == 'cat':
return CatToy()
构造模式
用来控制复杂对象的构造
创建和表示分离,比如你要买电脑,工厂模式直接给你需要的电脑
但是构造模式允许你自己定义电脑的配置,组装完成后给你
class Computer:
def __init__(self, serial_number):
self.serial = serial_number
self.memory = None # in gigabytes
self.hdd = None # in gigabytes
self.gpu = None
def __str__(self):
info = ('Memory: {}GB'.format(self.memory),
'Hard Disk: {}GB'.format(self.hdd),
'Graphics Card: {}'.format(self.gpu))
return '\n'.join(info)
class ComputerBuilder:
def __init__(self):
self.computer = Computer('AG23385193')
def configure_memory(self, amount):
self.computer.memory = amount
def configure_hdd(self, amount):
self.computer.hdd = amount
def configure_gpu(self, gpu_model):
self.computer.gpu = gpu_model
class HardwareEngineer:
def __init__(self):
self.builder = None
def construct_computer(self, memory, hdd, gpu):
self.builder = ComputerBuilder()
[step for step in (self.builder.configure_memory(memory),
self.builder.configure_hdd(hdd),
self.builder.configure_gpu(gpu))]
@property
def computer(self):
return self.builder.computer
# 使用buidler,可以创建多个builder类实现不同的组装方式
engineer = HardwareEngineer()
engineer.construct_computer(hdd=500, memory=8, gpu='GeForce GTX 650 Ti')
computer = engineer.computer
print(computer)
原型模式
通过克隆原型来创建新的实例
可以使用相同的原型,通过修改部分属性来创建新的示例
用途:对于一些创建实例开销比较高的地方可以用原型实例
单例模式
单例模式:一个类创建出来的对象都是同一个
Python的模块其实就是单例的,只会导入一次
使用共享同一个实例的方式来创建单例模式
#单例模式
class Singleton:
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super().__new__(cls, *args, **kwargs)
return cls._instance
class MyClass(Singleton):
pass
a = MyClass()
b = MyClass()
assert a is b