建造者模式
我们想要创建一个有多个部分构成的对象, 而且它的构成需要一步步地完成,只有各个部分都创建好了,这个对象才算完成,因此就诞生了建造者模式。建造者模式将一个复杂的构造过程与其表现分离,这样, 同一个构建过程(使用同一个指挥者)可用于创建多个不同的表现。
建造者模式一般包括:一个指挥者(director), 多个建造者(builder),比如你去Kfc点餐,你要了个鳕鱼堡,你同事要了个鸡腿堡。你们的订单都是从同一个waiter下的单,waiter把订单交给了后台的工作者(建造者),经过加工后返回了一个构造好的汉堡。下面举例炒菜的过程,一共炒了两个菜,具体如下代码:
import abc
import time
class Dish(object):
def __init__(self):
self.ginger_onion = None
self.salt = None
self.edible_oil = None
self.vegetables = None
def __str__(self):
return 'dish including %s_%s_%s_%s' % (self.ginger_onion, self.edible_oil, self.vegetables, self.salt)
class Abstract_builder(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def add_edible_oil(self, *args, **kwargs):
pass
@abc.abstractmethod
def add_ginger_onion(self, *args, **kwargs):
pass
@abc.abstractmethod
def add_vegetables(self, *args, **kwargs):
pass
@abc.abstractmethod
def add_salt(self, *args, **kwargs):
pass
class Tomatoes_dish_builder(Abstract_builder):
def __init__(self):
self.dish = Dish()
def add_edible_oil(self):
self.dish.edible_oil = '地沟油'
time.sleep(1)
return self
def add_ginger_onion(self):
self.dish.ginger_onion = '老姜和大葱'
time.sleep(1)
return self
def add_vegetables(self):
self.dish.vegetables = '番茄'
time.sleep(1)
return self
def add_salt(self):
self.dish.salt = '海盐'
time.sleep(1)
print('tomatoes dish is ready')
return self
class Potato_dish_builder(Abstract_builder):
def __init__(self):
self.dish = Dish()
def add_edible_oil(self):
self.dish.edible_oil = '菜子油'
time.sleep(1)
return self
def add_ginger_onion(self):
self.dish.ginger_onion = '生姜和小葱'
time.sleep(1)
return self
def add_vegetables(self):
self.dish.vegetables = '新土豆'
time.sleep(1)
return self
def add_salt(self):
self.dish.salt = '加典盐'
time.sleep(1)
print('potato dish is ready')
return self
class Director(object):
def __init__(self):
self.builder = None
def build(self, builder):
self.builder = builder
self.builder.\
add_edible_oil().\
add_ginger_onion().\
add_vegetables().\
add_salt()
return self.builder.dish
if __name__ == '__main__':
tomato_builder = Tomatoes_dish_builder()
potato_builder = Potato_dish_builder()
director = Director()
tomato_dish = director.build(tomato_builder)
print(tomato_dish)
potato_dish = director.build(potato_builder)
print(potato_dish)
结果如下
tomatoes dish is ready
dish including 老姜和大葱_地沟油_番茄_海盐
potato dish is ready
dish including 生姜和小葱_菜子油_新土豆_加典盐
上面代码中实现了一个abstract builder基类,其中有四个必须实现的抽象方法,继承此类的类必须实现这四个方法,否则报错。实现了一个dish类,和一个director类。builder类采用了流利的建造者模式,builder类的方法中返回的都是self。这种流利的建造者模式看起来更清晰些。