1 概述
建造者模式也是一种管理一套对象的设计模式。类似抽象工厂模式,但是也有不同。建造者模式着重描述一步步构造一个复杂对象,而抽象工厂模式着重于多个系列的产品对象
举个例子,盖房子的流程是地基,垒墙,封顶,装饰
角色
抽象建造者:定义抽象类
具体建造者:定义具体建造者类
指挥者:导演类,在里面封装构建产品的过程
产品 : 要建造的产品类
2 代码实现
from abc import ABCMeta,abstractmethod
class House(metaclass=ABCMeta):
"""
产品类
"""
def __init__(self,footer=None,qiang=None,header=None,beauty=None):
self.footer = footer
self.qiang = qiang
self.header = header
self.beauty = beauty
def __str__(self):
return f"s1:{self.footer}-s2:{self.qiang}-s3:{self.header}-s4:{self.beauty}"
class BuilderHouse(metaclass=ABCMeta):
"""
抽象建造者类
"""
@abstractmethod
def build_footer(self):
pass
@abstractmethod
def build_qiang(self):
pass
@abstractmethod
def build_header(self):
pass
@abstractmethod
def build_beauty(self):
pass
class LowHouse(BuilderHouse):
"""
实际的产品类
"""
def __init__(self):
self.house = House()
def build_footer(self):
self.house.footer = "木头地基"
def build_qiang(self):
self.house.qiang = "石头墙"
def build_header(self):
self.house.header = "木头顶"
def build_beauty(self):
self.house.beauty = "简装"
class HighHouse(BuilderHouse):
def __init__(self):
self.house = House()
def build_footer(self):
self.house.footer = "混泥土地基"
def build_qiang(self):
self.house.qiang = "砖墙"
def build_header(self):
self.house.header = "水泥顶"
def build_beauty(self):
self.house.beauty = "精装"
class HouseDirector:
"""
指挥者类,描述产品构建的细节
"""
def build_house(self, builder:BuilderHouse):
builder.build_footer()
builder.build_qiang()
builder.build_header()
builder.build_beauty()
return builder.house
# 高层代码:
builder = HighHouse()
hd = HouseDirector()
p = hd.build_house(builder)
print(p)
3 优势&劣势
优势
隐藏了一个产品的内部结构和装配过程和顺序
将构造代码与表示代码分开
可以对构造过程进行更精细的控制