建造者模式
建造者模式:
将一个复杂对象的构造
与表示
分离,同样的构建过程可以创建不同的东西。
建造者模式与抽象工程模式相似,也用来创建复杂对象
主要区别是建造者模式着重一步步构造一个复杂对象,而抽象工厂模式着重于多个系列的产品对象。
角色:
抽象建造者:定义抽象类
具体建造者:定义具体建造者类
指挥者:导演类,在里面封装构建产品的过程
产品 : 要建造的产品类
优点:
隐藏了一个产品的内部结构、装配过程和顺序
将构造代码与表示代码分开,可以对构造过程进行更加精细的控制
python代码实现:
from abc import ABCMeta, abstractmethod
class Person(metaclass=ABCMeta):
"""
产品类
"""
def __init__(self, age=None, gender=None, height=None, weight=None):
self.age = age
self.gender = gender
self.height = height
self.weight = weight
def __str__(self):
return f"年龄:{
self.age}, 性别:{
self.gender}, 身高:{
self.height}, 体重:{
self.weight}"
class BuilderPerson(metaclass=ABCMeta):
"""
抽象建造者类
"""
@abstractmethod
def build_age(self):
pass
@abstractmethod
def build_gender(self):
pass
@abstractmethod
def build_height(self):
pass
@abstractmethod
def build_weight(self):
pass
class BuildYoungWomanPerson(BuilderPerson):
"""
实际的产品类
"""
def __init__(self):
self.person = Person()
def build_age(self):
self.person.age = "18"
def build_gender(self):
self.person.gender = "女"
def build_height(self):
self.person.height = "1.7m"
def build_weight(self):
self.person.weight = "50kg"
class BuildOldManPerson(BuilderPerson):
"""
实际的产品类
"""
def __init__(self):
self.person = Person()
def build_age(self):
self.person.age = "60"
def build_gender(self):
self.person.gender = "男"
def build_height(self):
self.person.height = "1.8m"
def build_weight(self):
self.person.weight = "70g"
class PersonDirector:
"""
指挥者类,描述产品构建的细节
"""
def build_person(self, builder: BuilderPerson):
builder.build_age()
builder.build_gender()
builder.build_height()
builder.build_weight()
return builder.person
# 高层代码:
# 创建年轻的女人
builder1 = BuildYoungWomanPerson()
hd = PersonDirector()
p = hd.build_person(builder1)
print(p)
# 创建老男人
builder2 = BuildOldManPerson()
hd2 = PersonDirector()
p2 = hd2.build_person(builder2)
print(p2)
# 输出
================================
年龄:18, 性别:女, 身高:1.7m, 体重:50kg
年龄:60, 性别:男, 身高:1.8m, 体重:70g