建造者模式的定义如下:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 建造者模式的作用,就是将“构建”和“表示”分离,以达到解耦的作用。比如像汽车就由车身、发动机、车轮、方向盘等很多部件组成,而且整个组装的过程可能还要安装一定的顺序进行。
class Car(object): """产品 """ def __init__(self, name): self.name = name self.body = None self.engine = None self.tire = None def __str__(self): info = ("Name: {}".format(self.name), "Body: {}".format(self.body), "Engine: {}".format(self.engine), "Tire: {}".format(self.tire)) return '\n'.join(info)但是在现实使用时,用户可能并不关心汽车的这些细节和如何将这些部件组装成汽车的,而只是想通过特定的接口和参数获得汽车这个对象。这时就需要将这个复杂的过程抽象到到一个被称作建造者的对象里,建造者来负责构造这些复杂的组成:
class CarBuilder(object): """建造者 """ def __init__(self): self.car = Car("Mercedes") def add_body(self, body): self.car.body = body def add_engine(self, engine): """AMG 5.5L V8 biturbo""" self.car.engine = engine def add_tire(self, tire): self.car.tire = tire def assemble_car(self): return self.car最后建造者模式中还会引入了一个指挥者类的角色,该类的作用主要是负责精确地控制产品的整个生成过程,根据用户的不同需求返回不同的完整产品对象。
class Engineer(object): """指挥者 """ def __init__(self): self.builder = None def construct_car(self, body, engine, tire): self.builder = CarBuilder() self.builder.add_body(body) self.builder.add_engine(engine) self.builder.add_tire(tire) return self.builder.assemble_car()只要把需求告诉指挥者,用户就可以获得一个产品的实例,如下所示:
engineer = Engineer() car = engineer.construct_car( body="G63", engine="AMG 5.5L V8 biturbo", tire="Michelin 18inch") print(car) # Output >Name: Mercedes >Body: G63 >Engine: AMG 5.5L V8 biturbo >Tire: Michelin 18inch优点: 1、封装性好,用户可以不知道对象的内部构造和细节,就可以直接建造对象; 2、系统扩展容易; 3、建造者模式易于使用,非常灵活。在构造性的场景中很容易实现“流水线”; 4、便于控制细节。 使用场景: 1、目标对象由组件构成的场景中,很适合建造者模式。例如,在一款赛车游戏中,车辆生成时,需要根据级别、环境等,选择轮胎、悬挂、骨架等部件,构造一辆“赛车”; 2、在具体的场景中,对象内部接口需要根据不同的参数而调用顺序有所不同时,可以使用建造者模式。例如:一个植物养殖器系统,对于某些不同的植物,浇水、施加肥料的顺序要求可能会不同,因而可以在Director中维护一个类似于队列的结构,在实例化时作为参数代入到具体建造者中。
1、“加工工艺”对用户不透明。(封装的两面性)
