Builder模式
Builder模式帮你把一个不同类的大工程分开成不同的部分,最后在把这些合并起来
python的例子
制造一辆车的工序是很繁琐和浩大的,我们可以定一个车辆的描述
class Vehicle(object):
def __init__(self, type_name):
self.type = type_name
self.wheels = None
self.doors = None
self.seats = None
# 不同的车子类型,齿轮,车门数,座位数都不尽相同
def view(self):
print(
"This vehicle is a " +
self.type +
" with; " +
str(self.wheels) +
" wheels, " +
str(self.doors) +
" doors, and " +
str(self.seats) +
" seats."
)
这里我要把制造齿轮,车门,座位的工序抽象出来,用不同的制造部门去做
class VehicleBuilder(object):
__metadata__ = abc.ABCMeta
# 装饰器定义抽象方法(只能用在 metaclass 为 abc.ABCMeta 或其子类的 class 中)
# 这里其实当然可以用pass,或者raise一个基类未实现的异常
@abc.abstractmethod
def make_wheels(self):
raise
@abc.abstractmethod
def make_doors(self):
raise
@abc.abstractmethod
def make_seats(self):
raise
然后设想我要制造汽车和自行车, 每个都要继承这个VehicleBuilder基类,但是齿轮,车门,座位都是不一样的
class CarBuilder(VehicleBuilder):
def __init__(self):
self.vehicle = Vehicle("Car ")
def make_wheels(self):
self.vehicle.wheels = 4
def make_doors(self):
self.vehicle.doors = 3
def make_seats(self):
self.vehicle.seats = 5
class BikeBuilder(VehicleBuilder):
def __init__(self):
self.vehicle = Vehicle("Bike")
def make_wheels(self):
self.vehicle.wheels = 2
def make_doors(self):
self.vehicle.doors = 0
def make_seats(self):
self.vehicle.seats = 2
下面是最重要的环节:制造的Director
class VehicleManufacturer(object):
def __init__(self):
self.builder = None
# 根据传进来的builder制造它提供的产品规格
def create(self):
assert not self.builder is None, "No defined builder"
self.builder.make_wheels()
self.builder.make_doors()
self.builder.make_seats()
return self.builder.vehicle
看起来是不是有点和以前的模式不好分辨? 主要下面的调用方式
if __name__ == "__main__":
manufacturer = VehicleManufacturer()
# 重要的是这样的调用方式,每次修改builder方法传入不同的要求,然后在create里面去制造,
# 整个过程都是在VehicleManufacturer完成
manufacturer.builder = CarBuilder()
car = manufacturer.create()
car.view()
manufacturer.builder = BikeBuilder()
bike = manufacturer.create()
bike.view()