python 设计模式(四) 建造者模式(builder design pattern)

建造者模式

     我们想要创建一个有多个部分构成的对象, 而且它的构成需要一步步地完成,只有各个部分都创建好了,这个对象才算完成,因此就诞生了建造者模式。建造者模式将一个复杂的构造过程与其表现分离,这样, 同一个构建过程(使用同一个指挥者)可用于创建多个不同的表现。

    建造者模式一般包括:一个指挥者(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。这种流利的建造者模式看起来更清晰些。

猜你喜欢

转载自blog.csdn.net/ruguowoshiyu/article/details/80755001