GOF设计模式分三大类:
建造者模式(Builder Pattern)
定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
解决问题:如何一步步创建一个包含多个组成部分的复杂对象?
使用场景:
组成:
复杂产品(Product):最终要构建的复杂对象。 复杂对象是指那些包含多个成员变量的对象,这些成员变量也称为部件或零件。
抽象建造者(Builder):为一个抽象接口,定义了构建产品的各个部件的操作。
具体建造者(Concrete Builder):实现抽象建造者的接口,定义并明确各个部件的具体实现。
(可省略)指挥者(Director):负责安排已有模块的构建顺序,它主要用来控制产品的创建过程。
优点:
缺点:
使用建造者模式来实现游戏角色的创建
"""复杂产品"""
class Actor:
def __init__(self, type=None, sex=None, face=None, costume=None, hairstyle=None):
self.type = type
self.sex = sex
self.face = face
self.costume = costume
self.hairstyle = hairstyle
"""抽象建造者"""
class ActorBuilder:
def __init__(self):
self.actor = Actor()
def build_type(self):
raise NotImplementedError
def build_sex(self):
raise NotImplementedError
def build_face(self):
raise NotImplementedError
def build_costume(self):
raise NotImplementedError
def build_hairstyle(self):
raise NotImplementedError
def create_actor(self) -> Actor:
return self.actor
"""具体建造者"""
class HeroBuilder(ActorBuilder):
def build_type(self):
self.actor.type = "英雄"
def build_sex(self):
self.actor.sex = "男"
def build_face(self):
self.actor.face = "英俊"
def build_costume(self):
self.actor.costume = "盔甲"
def build_hairstyle(self):
self.actor.hairstyle = "飘逸"
class AngelBuilder(ActorBuilder):
def build_type(self):
self.actor.type = "天使"
def build_sex(self):
self.actor.sex = "女"
def build_face(self):
self.actor.face = "漂亮"
def build_costume(self):
self.actor.costume = "白裙"
def build_hairstyle(self):
self.actor.hairstyle = "披肩长发"
"""指挥者"""
class ActorController:
def construct(self, ab: ActorBuilder):
ab.build_type()
ab.build_sex()
ab.build_face()
ab.build_costume()
ab.build_hairstyle()
return ab.create_actor()
引入配置文件config.json
{
"class_name": "AngelBuilder"
}
读取配置文件的工具类JsonUtil
# 模块 utils.py
from pathlib import Path
import json
class JsonUtil:
@staticmethod
def get_class_name():
"""读取配置文件,返回配置文件中的配置"""
path = Path("config.json")
contents = path.read_text(encoding="utf-8")
conf = json.loads(contents)
return conf.get("class_name", None)
客户端代码
import actors
from actors import Actor, ActorBuilder, ActorController
from utils import JsonUtil
def display(actor: Actor):
print(f"类型:{actor.type}")
print(f"性别:{actor.sex}")
print(f"面容:{actor.face}")
print(f"服装:{actor.costume}")
print(f"发型:{actor.hairstyle}")
class_name = JsonUtil.get_value("class_name")
klass = getattr(actors, class_name, None)
if klass:
ab: ActorBuilder = klass() # 反射生成具体建造者对象
ac = ActorController()
actor = ac.construct(ab) # 通过指挥者创建完整的建造者对象
display(actor)
输出结果
类型:天使
性别:女
面容:漂亮
服装:白裙
发型:披肩长发
当construct()方法较为简单时,建议省略指挥者。简化了系统结构,但加重了抽象建造者类的职责。
"""复杂产品(不变)"""
"""抽象建造者(用construct()方法替换原来的create_actor()方法)"""
class ActorBuilder:
def __init__(self):
self.actor = Actor()
def build_type(self):
raise NotImplementedError
def build_sex(self):
raise NotImplementedError
def build_face(self):
raise NotImplementedError
def build_costume(self):
raise NotImplementedError
def build_hairstyle(self):
raise NotImplementedError
def construct(self) -> Actor:
self.build_type()
self.build_sex()
self.build_face()
self.build_costume()
self.build_hairstyle()
return self.actor
"""具体建造者(不变)"""
"""指挥者(可以删除)"""
客户端代码
import actors
from actors import Actor, ActorBuilder
from utils import JsonUtil
def display(actor: Actor):
print(f"类型:{actor.type}")
print(f"性别:{actor.sex}")
print(f"面容:{actor.face}")
print(f"服装:{actor.costume}")
print(f"发型:{actor.hairstyle}")
class_name = JsonUtil.get_value("class_name")
klass = getattr(actors, class_name, None)
if klass:
ab: ActorBuilder = klass() # 反射生成具体建造者对象
actor = ab.construct()
display(actor)
钩子方法的返回类型通常为boolean类型,方法名一般为isxx()
。
"""抽象建造者"""
class ActorBuilder:
#...
def is_bareheaded(self):
return False
#...
"""抽象建造者"""
class ActorBuilder:
#...
def construct(self) -> Actor:
self.build_type()
self.build_sex()
self.build_face()
self.build_costume()
if not self.is_bareheaded():
self.build_hairstyle()
return self.actor
#...
您正在阅读的是《设计模式Python版》专栏!关注不迷路~