def __delattr__(self, name):
""" Remove non-slot field attribute. """
try:
del self._attrs[name]
except KeyError:
raise AttributeError(name)
def __str__(self):
return "%s.%s" % (self.model_name, self.name)
def __repr__(self):
return "%s.%s" % (self.model_name, self.name)
一、 建造者模式
想要创建一个由多个部分构成的对象,而且他的构成需要一步接一步地完成。只有当各个部分都创建好,这个对象才是完整的。这时就需要建造者模式
建造者设计模式:将一个复杂对象的构造过程与其表现分离,构造过程可用于创建多个不同的表现。
该模式中有两个参与者:建造者和指挥者
建造者负责创建复杂对象的各个组成部分。
指挥者使用建造者实例控制建造的过程。
1.工厂模式以单个步骤创建对象,而建造者模式以多个步骤创建独享,并且几乎始终使用同一个指挥者;
2.在工厂模式下,会立即返回一个创建好的对象;而在建造者模式下,仅在需要时客户端代码才显示地请求指挥者返回最终的对象。
1. 建造者模式的苹果电脑应用案例
类里面套一个类,这种写法可以禁止直接实例化一个类的简洁方式
一个苹果电脑的例子,制造商将所有的硬件规格都隐藏了起来,客户只知道去买某个品牌和型号的笔记本
可以看到只有AppleFactory
类实例化, 但生产的其他参数都隐藏了起来,无法直接实例化生产过程MacMini14
类
过程的参数,让购买者无需关心内部生产的过程
# 设计模式
MINI14 = '1.4GHZ MAC MINI'
class AppleFactory:
class MacMini14:
def __init__(self):
self.menory = 8
self.hdd = 500
self.gpu = 'Inter HD Graphics 5000'
def __str__(self):
info = (
'Model:{}'.format(MINI14),
'Memory:{}'.format(self.menory),
'Hard Disk:{}'.format(self.hdd),
'Graphics Card: {}'.format(self.gpu))
return '\n'.join(info)
def build_computer(self,model):
if (model==MINI14):
return self.MacMini14()
else:
print("i dont know how to build {}".format(model))
if __name__=='__main__':
afac=AppleFactory()
mac_mini=afac.build_computer(MINI14)
print (mac_mini)
工厂模式和建造者模式的区别
- 工厂模式以单个步骤创建对象,创建者模式以多个步骤创建对象,并且几乎始终会使用一个指挥者。
- 在工厂模式下,会立即返回一个创建好的对象;而在建造者模式下,仅在需要时客户端代码才显示地请求指挥者返回最终的对象
2. 案例二:作为指挥者向制造商提供指令,制作想要的电脑
首先实例化HardwareEngineer
,调用并传参construct_computer(self, memory, hdd, gpu)
,再去实例化ComputerBuilder()
--> Computer()
列表式执行函数
[step for step in (self.builder.configure_momory(memory),
self.builder.configure_hdd(hdd),
self.builder.configure_gpu(gpu))]
class Computer:
def __init__(self, serial_number):
self.serial = serial_number
self.memory = None # 单位为GB
self.hdd = None # 单位为GB
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_momory(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_momory(memory),
self.builder.configure_hdd(hdd),
self.builder.configure_gpu(gpu))]
@property
def computer(self):
return self.builder.computer
def main():
engineer = HardwareEngineer()
engineer.construct_computer(hdd=500, memory=8, gpu='GeForce GTX 650 Ti')
computer = engineer.computer
print(computer)
if __name__ == '__main__':
'''
通过HardwareEngineer(传参调用ComputerBuilder,可以使用其他类也可以) --> ComputerBuilder --> Computer(负责打印输出数据)
'''
main()
# 设计模式
MINI14 = '1.4GHZ MAC MINI'
class AppleFactory:
class MacMini14:
def __init__(self):
self.menory = 8
self.hdd = 500
self.gpu = 'Inter HD Graphics 5000'
def __str__(self):
info = (
'Model:{}'.format(MINI14),
'Memory:{}'.format(self.menory),
'Hard Disk:{}'.format(self.hdd),
'Graphics Card: {}'.format(self.gpu))
return '\n'.join(info)
def build_computer(self,model):
if (model==MINI14):
return self.MacMini14()
else:
print("i dont know how to build {}".format(model))
if __name__=='__main__':
afac=AppleFactory()
mac_mini=afac.build_computer(MINI14)
print (mac_mini)
心有猛虎,细嗅蔷薇