Skip to content

第4章 建造者模式

学习目标

完成本章学习后,读者将能够:

  • 深入理解建造者模式的理论基础、设计动机与形式化定义
  • 掌握Python语言特性下的多种建造者实现机制及其设计权衡
  • 分析建造者模式与工厂模式、原型模式的本质区别与适用场景
  • 设计复杂对象的分步构建体系与链式API
  • 评估建造者模式在软件架构中的利弊与替代方案

4.1 理论基础与模式定义

4.1.1 形式化定义

建造者模式(Builder Pattern) 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。其核心思想可形式化表述为:

$$\text{Product} = \text{Builder}.\text{build_part}_1() \circ \text{build_part}_2() \circ ... \circ \text{build_part}_n() \circ \text{get_result}()$$

其中 $\circ$ 表示构建步骤的组合操作。该模式满足以下约束:

构建独立性约束

$$\forall b \in \text{Builder}, \forall p_1, p_2 \in \text{Parts}: \text{build}(p_1) \perp \text{build}(p_2)$$

即各部件的构建相互独立,构建顺序不影响最终结果(在语义等价的前提下)。

表示多样性约束

$$\forall b_1, b_2 \in \text{ConcreteBuilder}, b_1 \neq b_2 \Rightarrow \text{Result}(b_1) \neq \text{Result}(b_2)$$

即不同的具体建造者产生不同的产品表示。

4.1.2 历史演进与学术背景

建造者模式源于对复杂对象创建问题的抽象。在软件工程实践中,存在一类对象具有以下特征:

  1. 多部件组成:由多个子部件构成
  2. 构建复杂:需要多个步骤完成构建
  3. 表示多样:同一构建过程可产生不同表示
  4. 验证需求:构建过程需要验证约束条件
┌─────────────────────────────────────────────────────────────────┐
│                    构造函数 vs 建造者模式                        │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  构造函数方式                                                   │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │  Computer(cpu, ram, storage, gpu, motherboard,          │   │
│  │           power_supply, case, cooling, peripherals)     │   │
│  │                                                         │   │
│  │  问题:                                                   │   │
│  │  - 参数列表过长,难以理解                                 │   │
│  │  - 可选参数需要传递None                                   │   │
│  │  - 参数顺序容易混淆                                       │   │
│  │  - 无法进行中间验证                                       │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
│  建造者模式                                                     │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │  ComputerBuilder()                                       │   │
│  │      .set_cpu("i9")                                      │   │
│  │      .set_ram("64GB")                                    │   │
│  │      .set_storage("2TB")                                 │   │
│  │      .build()                                            │   │
│  │                                                         │   │
│  │  优势:                                                   │   │
│  │  - 链式调用,语义清晰                                     │   │
│  │  - 可选参数自然省略                                       │   │
│  │  - 命名明确,不易混淆                                     │   │
│  │  - 可在build()时验证                                      │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

4.1.3 模式动机与应用场景

建造者模式解决的核心问题是复杂对象的分步构建。考虑以下典型场景:

应用场景复杂性来源建造者优势
计算机配置多种硬件组合链式配置、验证兼容性
SQL查询动态条件组合安全构建、防止注入
HTTP请求多种请求选项流畅API、类型安全
文档生成结构化内容分步构建、模板支持
游戏角色多属性配置默认值、验证规则
配置对象嵌套配置层级构建、环境适配

核心设计动机

  1. 分离构建与表示:相同的构建过程创建不同的表示
  2. 分步构建:将复杂构建分解为简单步骤
  3. 参数命名:通过方法名明确参数含义
  4. 验证机制:在构建时验证约束条件
  5. 不可变对象:构建完成后对象不可修改

4.1.4 UML结构模型

┌─────────────────────────────────────────────────────────────────┐
│                      Director «optional»                         │
├─────────────────────────────────────────────────────────────────┤
│  - builder: Builder                                              │
│  + construct(): Product                                          │
│                                                                 │
│  // 封装标准构建流程                                              │
│  construct():                                                    │
│      builder.build_part_a()                                      │
│      builder.build_part_b()                                      │
│      builder.build_part_c()                                      │
│      return builder.get_result()                                 │
└─────────────────────────────────────────────────────────────────┘
                           │ uses

┌─────────────────────────────────────────────────────────────────┐
│                      Builder «interface»                         │
├─────────────────────────────────────────────────────────────────┤
│  + build_part_a(): void                                          │
│  + build_part_b(): void                                          │
│  + build_part_c(): void                                          │
│  + get_result(): Product                                         │
└─────────────────────────────────────────────────────────────────┘

                           │ implements
              ┌────────────┴────────────┐
              │                         │
┌─────────────┴─────────┐   ┌──────────┴──────────┐
│  ConcreteBuilder1     │   │  ConcreteBuilder2   │
├───────────────────────┤   ├─────────────────────┤
│  - product: Product1  │   │  - product: Product2│
│  + build_part_a()     │   │  + build_part_a()   │
│  + build_part_b()     │   │  + build_part_b()   │
│  + build_part_c()     │   │  + build_part_c()   │
│  + get_result()       │   │  + get_result()     │
└───────────────────────┘   └─────────────────────┘
         │                           │
         │ creates                   │ creates
         ▼                           ▼
┌─────────────────┐         ┌─────────────────┐
│    Product1     │         │    Product2     │
├─────────────────┤         ├─────────────────┤
│  - part_a       │         │  - part_a       │
│  - part_b       │         │  - part_b       │
│  - part_c       │         │  - part_c       │
└─────────────────┘         └─────────────────┘

结构要素解析

角色职责是否必需
Builder声明构建步骤的抽象接口必需
ConcreteBuilder实现具体构建步骤必需
Product被构建的复杂对象必需
Director封装标准构建流程可选

4.2 Python实现机制深度解析

4.2.1 经典建造者模式

python
from abc import ABC, abstractmethod
from typing import Optional, List, Dict, Any, TypeVar, Generic
from dataclasses import dataclass, field
from enum import Enum, auto

T = TypeVar('T')

@dataclass
class Computer:
    """计算机产品"""
    cpu: str = ""
    ram: str = ""
    storage: str = ""
    gpu: Optional[str] = None
    motherboard: str = ""
    power_supply: str = ""
    case: str = ""
    cooling: str = ""
    peripherals: List[str] = field(default_factory=list)
    
    def get_specs(self) -> Dict[str, Any]:
        return {
            "CPU": self.cpu,
            "RAM": self.ram,
            "Storage": self.storage,
            "GPU": self.gpu or "集成显卡",
            "Motherboard": self.motherboard,
            "Power": self.power_supply,
            "Case": self.case,
            "Cooling": self.cooling,
            "Peripherals": self.peripherals
        }


class ComputerBuilder(ABC):
    """计算机建造者抽象基类"""
    
    @abstractmethod
    def build_cpu(self, cpu: str) -> 'ComputerBuilder':
        pass
    
    @abstractmethod
    def build_ram(self, ram: str) -> 'ComputerBuilder':
        pass
    
    @abstractmethod
    def build_storage(self, storage: str) -> 'ComputerBuilder':
        pass
    
    @abstractmethod
    def build_gpu(self, gpu: str) -> 'ComputerBuilder':
        pass
    
    @abstractmethod
    def build_motherboard(self, motherboard: str) -> 'ComputerBuilder':
        pass
    
    @abstractmethod
    def build_power_supply(self, power_supply: str) -> 'ComputerBuilder':
        pass
    
    @abstractmethod
    def build_case(self, case: str) -> 'ComputerBuilder':
        pass
    
    @abstractmethod
    def build_cooling(self, cooling: str) -> 'ComputerBuilder':
        pass
    
    @abstractmethod
    def add_peripheral(self, peripheral: str) -> 'ComputerBuilder':
        pass
    
    @abstractmethod
    def get_result(self) -> Computer:
        pass


class GamingComputerBuilder(ComputerBuilder):
    """游戏电脑建造者"""
    
    def __init__(self):
        self._computer = Computer()
    
    def build_cpu(self, cpu: str) -> 'GamingComputerBuilder':
        self._computer.cpu = cpu
        return self
    
    def build_ram(self, ram: str) -> 'GamingComputerBuilder':
        self._computer.ram = ram
        return self
    
    def build_storage(self, storage: str) -> 'GamingComputerBuilder':
        self._computer.storage = storage
        return self
    
    def build_gpu(self, gpu: str) -> 'GamingComputerBuilder':
        self._computer.gpu = gpu
        return self
    
    def build_motherboard(self, motherboard: str) -> 'GamingComputerBuilder':
        self._computer.motherboard = motherboard
        return self
    
    def build_power_supply(self, power_supply: str) -> 'GamingComputerBuilder':
        self._computer.power_supply = power_supply
        return self
    
    def build_case(self, case: str) -> 'GamingComputerBuilder':
        self._computer.case = case
        return self
    
    def build_cooling(self, cooling: str) -> 'GamingComputerBuilder':
        self._computer.cooling = cooling
        return self
    
    def add_peripheral(self, peripheral: str) -> 'GamingComputerBuilder':
        self._computer.peripherals.append(peripheral)
        return self
    
    def get_result(self) -> Computer:
        self._validate()
        return self._computer
    
    def _validate(self):
        if not self._computer.cpu:
            raise ValueError("CPU是必需的")
        if not self._computer.ram:
            raise ValueError("RAM是必需的")
        if not self._computer.gpu:
            raise ValueError("游戏电脑必须配置独立显卡")


class OfficeComputerBuilder(ComputerBuilder):
    """办公电脑建造者"""
    
    def __init__(self):
        self._computer = Computer()
    
    def build_cpu(self, cpu: str) -> 'OfficeComputerBuilder':
        self._computer.cpu = cpu
        return self
    
    def build_ram(self, ram: str) -> 'OfficeComputerBuilder':
        self._computer.ram = ram
        return self
    
    def build_storage(self, storage: str) -> 'OfficeComputerBuilder':
        self._computer.storage = storage
        return self
    
    def build_gpu(self, gpu: str) -> 'OfficeComputerBuilder':
        self._computer.gpu = gpu
        return self
    
    def build_motherboard(self, motherboard: str) -> 'OfficeComputerBuilder':
        self._computer.motherboard = motherboard
        return self
    
    def build_power_supply(self, power_supply: str) -> 'OfficeComputerBuilder':
        self._computer.power_supply = power_supply
        return self
    
    def build_case(self, case: str) -> 'OfficeComputerBuilder':
        self._computer.case = case
        return self
    
    def build_cooling(self, cooling: str) -> 'OfficeComputerBuilder':
        self._computer.cooling = cooling
        return self
    
    def add_peripheral(self, peripheral: str) -> 'OfficeComputerBuilder':
        self._computer.peripherals.append(peripheral)
        return self
    
    def get_result(self) -> Computer:
        self._validate()
        return self._computer
    
    def _validate(self):
        if not self._computer.cpu:
            raise ValueError("CPU是必需的")
        if not self._computer.ram:
            raise ValueError("RAM是必需的")


class ComputerDirector:
    """
    计算机指挥者
    
    职责:
        - 封装标准构建流程
        - 提供预设配置方案
    """
    
    def __init__(self, builder: ComputerBuilder):
        self._builder = builder
    
    def build_high_end_gaming(self) -> Computer:
        """构建高端游戏电脑"""
        return (self._builder
            .build_cpu("Intel i9-13900K")
            .build_ram("64GB DDR5-6000")
            .build_storage("2TB Samsung 990 Pro NVMe")
            .build_gpu("NVIDIA RTX 4090 24GB")
            .build_motherboard("ASUS ROG Maximus Z790")
            .build_power_supply("1200W 80+ Titanium")
            .build_case("Lian Li O11 Dynamic EVO")
            .build_cooling("360mm AIO + 6x 120mm Fans")
            .add_peripheral("ROG Azoth Keyboard")
            .add_peripheral("ROG Gladius III Mouse")
            .add_peripheral("ROG Swift PG32UQ Monitor")
            .get_result())
    
    def build_mid_range_gaming(self) -> Computer:
        """构建中端游戏电脑"""
        return (self._builder
            .build_cpu("AMD Ryzen 7 7800X3D")
            .build_ram("32GB DDR5-5200")
            .build_storage("1TB WD Black SN850X")
            .build_gpu("NVIDIA RTX 4070 Ti")
            .build_motherboard("MSI MAG B650 TOMAHAWK")
            .build_power_supply("750W 80+ Gold")
            .build_case("Corsair 4000D Airflow")
            .build_cooling("240mm AIO")
            .get_result())
    
    def build_office_workstation(self) -> Computer:
        """构建办公工作站"""
        return (self._builder
            .build_cpu("Intel i5-13600")
            .build_ram("16GB DDR4-3200")
            .build_storage("512GB NVMe SSD")
            .build_motherboard("ASUS Prime B760M-A")
            .build_power_supply("500W 80+ Bronze")
            .build_case("Fractal Design Define Mini")
            .build_cooling("Stock Cooler")
            .add_peripheral("Logitech MX Keys")
            .add_peripheral("Logitech MX Master 3")
            .get_result())


gaming_builder = GamingComputerBuilder()
director = ComputerDirector(gaming_builder)

high_end = director.build_high_end_gaming()
print("高端游戏电脑配置:")
for key, value in high_end.get_specs().items():
    print(f"  {key}: {value}")

4.2.2 流畅建造者模式(Fluent Builder)

流畅建造者模式利用Python的链式调用特性,提供更简洁的API:

python
from typing import Optional, List, Dict, Any, Callable, TypeVar
from dataclasses import dataclass, field
from functools import wraps

T = TypeVar('T')

def step(func: Callable) -> Callable:
    """步骤装饰器:自动返回self以支持链式调用"""
    @wraps(func)
    def wrapper(self, *args, **kwargs):
        func(self, *args, **kwargs)
        return self
    return wrapper


@dataclass
class HttpRequest:
    """HTTP请求"""
    method: str
    url: str
    headers: Dict[str, str] = field(default_factory=dict)
    query_params: Dict[str, str] = field(default_factory=dict)
    body: Optional[Any] = None
    timeout: float = 30.0
    retry_count: int = 0
    retry_delay: float = 1.0
    verify_ssl: bool = True
    follow_redirects: bool = True
    
    def to_curl(self) -> str:
        """生成curl命令"""
        parts = [f"curl -X {self.method}"]
        
        for key, value in self.headers.items():
            parts.append(f"-H '{key}: {value}'")
        
        if self.body:
            import json
            body_str = json.dumps(self.body) if isinstance(self.body, dict) else str(self.body)
            parts.append(f"-d '{body_str}'")
        
        url = self.url
        if self.query_params:
            query = "&".join(f"{k}={v}" for k, v in self.query_params.items())
            url = f"{url}?{query}"
        
        parts.append(f"'{url}'")
        return " ".join(parts)


class RequestBuilder:
    """
    HTTP请求建造者
    
    特性:
        - 流畅API设计
        - 类型安全
        - 验证机制
        - curl命令生成
    """
    
    def __init__(self, url: str):
        self._url = url
        self._method: str = "GET"
        self._headers: Dict[str, str] = {}
        self._query_params: Dict[str, str] = {}
        self._body: Optional[Any] = None
        self._timeout: float = 30.0
        self._retry_count: int = 0
        self._retry_delay: float = 1.0
        self._verify_ssl: bool = True
        self._follow_redirects: bool = True
        self._validators: List[Callable] = []
    
    def get(self) -> 'RequestBuilder':
        self._method = "GET"
        return self
    
    def post(self) -> 'RequestBuilder':
        self._method = "POST"
        return self
    
    def put(self) -> 'RequestBuilder':
        self._method = "PUT"
        return self
    
    def delete(self) -> 'RequestBuilder':
        self._method = "DELETE"
        return self
    
    def patch(self) -> 'RequestBuilder':
        self._method = "PATCH"
        return self
    
    def method(self, method: str) -> 'RequestBuilder':
        self._method = method.upper()
        return self
    
    def header(self, key: str, value: str) -> 'RequestBuilder':
        self._headers[key] = value
        return self
    
    def headers(self, headers: Dict[str, str]) -> 'RequestBuilder':
        self._headers.update(headers)
        return self
    
    def content_type(self, content_type: str) -> 'RequestBuilder':
        return self.header("Content-Type", content_type)
    
    def accept(self, accept: str) -> 'RequestBuilder':
        return self.header("Accept", accept)
    
    def json_content(self) -> 'RequestBuilder':
        return self.content_type("application/json").accept("application/json")
    
    def authorization(self, token: str, scheme: str = "Bearer") -> 'RequestBuilder':
        return self.header("Authorization", f"{scheme} {token}")
    
    def basic_auth(self, username: str, password: str) -> 'RequestBuilder':
        import base64
        credentials = base64.b64encode(f"{username}:{password}".encode()).decode()
        return self.header("Authorization", f"Basic {credentials}")
    
    def api_key(self, key: str, header_name: str = "X-API-Key") -> 'RequestBuilder':
        return self.header(header_name, key)
    
    def query(self, key: str, value: str) -> 'RequestBuilder':
        self._query_params[key] = value
        return self
    
    def queries(self, params: Dict[str, str]) -> 'RequestBuilder':
        self._query_params.update(params)
        return self
    
    def body(self, body: Any) -> 'RequestBuilder':
        self._body = body
        return self
    
    def json_body(self, data: Dict[str, Any]) -> 'RequestBuilder':
        self._body = data
        return self.json_content()
    
    def form_body(self, data: Dict[str, str]) -> 'RequestBuilder':
        self._body = data
        return self.content_type("application/x-www-form-urlencoded")
    
    def timeout(self, seconds: float) -> 'RequestBuilder':
        self._timeout = seconds
        return self
    
    def retry(self, count: int, delay: float = 1.0) -> 'RequestBuilder':
        self._retry_count = count
        self._retry_delay = delay
        return self
    
    def verify_ssl(self, verify: bool) -> 'RequestBuilder':
        self._verify_ssl = verify
        return self
    
    def follow_redirects(self, follow: bool) -> 'RequestBuilder':
        self._follow_redirects = follow
        return self
    
    def validate(self, validator: Callable[['HttpRequest'], bool]) -> 'RequestBuilder':
        self._validators.append(validator)
        return self
    
    def build(self) -> HttpRequest:
        request = HttpRequest(
            method=self._method,
            url=self._url,
            headers=self._headers.copy(),
            query_params=self._query_params.copy(),
            body=self._body,
            timeout=self._timeout,
            retry_count=self._retry_count,
            retry_delay=self._retry_delay,
            verify_ssl=self._verify_ssl,
            follow_redirects=self._follow_redirects
        )
        
        for validator in self._validators:
            if not validator(request):
                raise ValueError("请求验证失败")
        
        return request


request = (RequestBuilder("https://api.example.com/v1/users")
    .post()
    .json_body({
        "name": "张三",
        "email": "zhangsan@example.com",
        "role": "admin"
    })
    .authorization("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...")
    .query("notify", "true")
    .timeout(60.0)
    .retry(3, delay=2.0)
    .build())

print(f"方法: {request.method}")
print(f"URL: {request.url}")
print(f"curl: {request.to_curl()}")

4.2.3 类型安全的泛型建造者

python
from typing import Generic, TypeVar, Callable, Optional, Dict, Any, List
from dataclasses import dataclass, field
from abc import ABC, abstractmethod

T = TypeVar('T')
B = TypeVar('B', bound='BaseBuilder')

@dataclass
class BuildContext:
    """构建上下文"""
    started_at: float = field(default_factory=lambda: __import__('time').time())
    steps_completed: List[str] = field(default_factory=list)
    warnings: List[str] = field(default_factory=list)
    
    def record_step(self, step_name: str):
        self.steps_completed.append(step_name)
    
    def add_warning(self, message: str):
        self.warnings.append(message)


class BaseBuilder(ABC, Generic[T]):
    """
    建造者基类
    
    提供通用的构建基础设施:
        - 构建上下文管理
        - 验证器注册
        - 后处理器支持
    """
    
    def __init__(self):
        self._context = BuildContext()
        self._validators: List[Callable[[T], bool]] = []
        self._post_processors: List[Callable[[T], T]] = []
        self._required_fields: List[str] = []
    
    def require(self, field_name: str) -> 'BaseBuilder':
        """标记必需字段"""
        self._required_fields.append(field_name)
        return self
    
    def validate(self, validator: Callable[[T], bool]) -> 'BaseBuilder':
        """添加验证器"""
        self._validators.append(validator)
        return self
    
    def post_process(self, processor: Callable[[T], T]) -> 'BaseBuilder':
        """添加后处理器"""
        self._post_processors.append(processor)
        return self
    
    def _record_step(self, step_name: str):
        """记录构建步骤"""
        self._context.record_step(step_name)
    
    def _add_warning(self, message: str):
        """添加警告"""
        self._context.add_warning(message)
    
    @abstractmethod
    def _create_product(self) -> T:
        """创建产品实例"""
        pass
    
    @abstractmethod
    def _get_field_value(self, field_name: str) -> Any:
        """获取字段值"""
        pass
    
    def build(self) -> T:
        """构建产品"""
        for field_name in self._required_fields:
            if not self._get_field_value(field_name):
                raise ValueError(f"必需字段 '{field_name}' 未设置")
        
        product = self._create_product()
        
        for validator in self._validators:
            if not validator(product):
                raise ValueError("产品验证失败")
        
        for processor in self._post_processors:
            product = processor(product)
        
        return product
    
    def get_context(self) -> BuildContext:
        """获取构建上下文"""
        return self._context


@dataclass
class DatabaseConfig:
    """数据库配置"""
    host: str = "localhost"
    port: int = 3306
    database: str = ""
    username: str = ""
    password: str = ""
    pool_size: int = 5
    max_overflow: int = 10
    pool_timeout: float = 30.0
    charset: str = "utf8mb4"
    ssl_enabled: bool = False
    ssl_ca: Optional[str] = None
    
    def to_connection_string(self) -> str:
        return f"mysql://{self.username}:***@{self.host}:{self.port}/{self.database}"


class DatabaseConfigBuilder(BaseBuilder[DatabaseConfig]):
    """数据库配置建造者"""
    
    def __init__(self):
        super().__init__()
        self._host: str = "localhost"
        self._port: int = 3306
        self._database: str = ""
        self._username: str = ""
        self._password: str = ""
        self._pool_size: int = 5
        self._max_overflow: int = 10
        self._pool_timeout: float = 30.0
        self._charset: str = "utf8mb4"
        self._ssl_enabled: bool = False
        self._ssl_ca: Optional[str] = None
        
        self.require("database").require("username").require("password")
    
    def host(self, host: str) -> 'DatabaseConfigBuilder':
        self._host = host
        self._record_step("host")
        return self
    
    def port(self, port: int) -> 'DatabaseConfigBuilder':
        self._port = port
        self._record_step("port")
        return self
    
    def database(self, database: str) -> 'DatabaseConfigBuilder':
        self._database = database
        self._record_step("database")
        return self
    
    def credentials(self, username: str, password: str) -> 'DatabaseConfigBuilder':
        self._username = username
        self._password = password
        self._record_step("credentials")
        return self
    
    def pool(self, size: int, max_overflow: int = 10, timeout: float = 30.0) -> 'DatabaseConfigBuilder':
        self._pool_size = size
        self._max_overflow = max_overflow
        self._pool_timeout = timeout
        self._record_step("pool")
        return self
    
    def charset(self, charset: str) -> 'DatabaseConfigBuilder':
        self._charset = charset
        return self
    
    def ssl(self, ca_path: str = None) -> 'DatabaseConfigBuilder':
        self._ssl_enabled = True
        self._ssl_ca = ca_path
        self._record_step("ssl")
        return self
    
    def _create_product(self) -> DatabaseConfig:
        return DatabaseConfig(
            host=self._host,
            port=self._port,
            database=self._database,
            username=self._username,
            password=self._password,
            pool_size=self._pool_size,
            max_overflow=self._max_overflow,
            pool_timeout=self._pool_timeout,
            charset=self._charset,
            ssl_enabled=self._ssl_enabled,
            ssl_ca=self._ssl_ca
        )
    
    def _get_field_value(self, field_name: str) -> Any:
        return getattr(self, f'_{field_name}', None)


config = (DatabaseConfigBuilder()
    .host("192.168.1.100")
    .port(3306)
    .database("production_db")
    .credentials("admin", "secret_password")
    .pool(size=20, max_overflow=10, timeout=60.0)
    .ssl("/path/to/ca.pem")
    .validate(lambda c: c.port > 0 and c.port < 65536)
    .build())

print(f"连接字符串: {config.to_connection_string()}")
print(f"连接池大小: {config.pool_size}")
print(f"SSL启用: {config.ssl_enabled}")

4.2.4 不可变对象建造者

python
from typing import Optional, List, Dict, Any, Tuple
from dataclasses import dataclass, field
from functools import cached_property
import hashlib
import json

@dataclass(frozen=True)
class ImmutableDocument:
    """
    不可变文档对象
    
    特性:
        - 创建后不可修改
        - 支持哈希和比较
        - 缓存计算属性
    """
    title: str
    content: str
    author: str
    tags: Tuple[str, ...] = field(default_factory=tuple)
    metadata: Tuple[Tuple[str, str], ...] = field(default_factory=tuple)
    version: int = 1
    created_at: str = field(default_factory=lambda: __import__('datetime').datetime.now().isoformat())
    
    @cached_property
    def content_hash(self) -> str:
        """内容哈希值"""
        return hashlib.sha256(self.content.encode()).hexdigest()[:16]
    
    @cached_property
    def word_count(self) -> int:
        """字数统计"""
        return len(self.content.split())
    
    @cached_property
    def tag_set(self) -> set:
        """标签集合"""
        return set(self.tags)
    
    def to_dict(self) -> Dict[str, Any]:
        return {
            "title": self.title,
            "content": self.content,
            "author": self.author,
            "tags": list(self.tags),
            "metadata": dict(self.metadata),
            "version": self.version,
            "created_at": self.created_at,
            "content_hash": self.content_hash
        }
    
    def __hash__(self):
        return hash((self.title, self.content, self.author, self.tags, self.version))


class DocumentBuilder:
    """
    不可变文档建造者
    
    特性:
        - 构建不可变对象
        - 支持从现有文档创建变体
        - 自动计算派生属性
    """
    
    def __init__(self):
        self._title: str = ""
        self._content: str = ""
        self._author: str = ""
        self._tags: List[str] = []
        self._metadata: Dict[str, str] = {}
        self._version: int = 1
        self._created_at: Optional[str] = None
    
    @classmethod
    def from_document(cls, document: ImmutableDocument) -> 'DocumentBuilder':
        """从现有文档创建建造者"""
        builder = cls()
        builder._title = document.title
        builder._content = document.content
        builder._author = document.author
        builder._tags = list(document.tags)
        builder._metadata = dict(document.metadata)
        builder._version = document.version
        builder._created_at = document.created_at
        return builder
    
    def title(self, title: str) -> 'DocumentBuilder':
        self._title = title
        return self
    
    def content(self, content: str) -> 'DocumentBuilder':
        self._content = content
        return self
    
    def author(self, author: str) -> 'DocumentBuilder':
        self._author = author
        return self
    
    def add_tag(self, tag: str) -> 'DocumentBuilder':
        if tag not in self._tags:
            self._tags.append(tag)
        return self
    
    def tags(self, *tags: str) -> 'DocumentBuilder':
        for tag in tags:
            self.add_tag(tag)
        return self
    
    def metadata(self, key: str, value: str) -> 'DocumentBuilder':
        self._metadata[key] = value
        return self
    
    def version(self, version: int) -> 'DocumentBuilder':
        self._version = version
        return self
    
    def increment_version(self) -> 'DocumentBuilder':
        self._version += 1
        return self
    
    def build(self) -> ImmutableDocument:
        if not self._title:
            raise ValueError("标题不能为空")
        if not self._content:
            raise ValueError("内容不能为空")
        if not self._author:
            raise ValueError("作者不能为空")
        
        return ImmutableDocument(
            title=self._title,
            content=self._content,
            author=self._author,
            tags=tuple(self._tags),
            metadata=tuple(self._metadata.items()),
            version=self._version,
            created_at=self._created_at
        )


doc = (DocumentBuilder()
    .title("Python设计模式详解")
    .content("设计模式是软件工程中的重要概念..." * 100)
    .author("张三")
    .tags("Python", "设计模式", "软件工程", "编程")
    .metadata("category", "技术文档")
    .metadata("difficulty", "中级")
    .build())

print(f"标题: {doc.title}")
print(f"字数: {doc.word_count}")
print(f"内容哈希: {doc.content_hash}")
print(f"标签: {doc.tag_set}")

doc_v2 = (DocumentBuilder.from_document(doc)
    .content(doc.content + "\n\n新增内容...")
    .increment_version()
    .build())

print(f"\n版本: {doc_v2.version}")
print(f"哈希变化: {doc.content_hash} -> {doc_v2.content_hash}")

4.3 实际应用案例

4.3.1 企业级SQL查询构建器

python
from typing import Optional, List, Tuple, Any, Union
from dataclasses import dataclass, field
from enum import Enum, auto

class JoinType(Enum):
    INNER = "INNER JOIN"
    LEFT = "LEFT JOIN"
    RIGHT = "RIGHT JOIN"
    FULL = "FULL OUTER JOIN"
    CROSS = "CROSS JOIN"


class OrderDirection(Enum):
    ASC = "ASC"
    DESC = "DESC"


@dataclass
class SQLQuery:
    """SQL查询对象"""
    statement: str
    parameters: Tuple[Any, ...]
    
    def execute_on(self, connection) -> Any:
        """在连接上执行查询"""
        print(f"执行SQL: {self.statement}")
        print(f"参数: {self.parameters}")
        return None


class SQLBuilder:
    """
    SQL查询建造者
    
    特性:
        - 类型安全的查询构建
        - 参数化查询防止SQL注入
        - 支持复杂查询(JOIN、子查询、聚合)
        - 查询优化提示
    """
    
    def __init__(self, table: str, alias: str = None):
        self._main_table = table
        self._main_alias = alias
        self._select_fields: List[str] = ["*"]
        self._distinct: bool = False
        self._joins: List[str] = []
        self._where_conditions: List[str] = []
        self._where_params: List[Any] = []
        self._group_by_fields: List[str] = []
        self._having_conditions: List[str] = []
        self._having_params: List[Any] = []
        self._order_by: List[str] = []
        self._limit: Optional[int] = None
        self._offset: Optional[int] = None
        self._lock_mode: Optional[str] = None
        self._ctes: List[str] = []
    
    def select(self, *fields: str) -> 'SQLBuilder':
        """指定查询字段"""
        if fields:
            self._select_fields = list(fields)
        return self
    
    def select_raw(self, expression: str) -> 'SQLBuilder':
        """添加原始表达式"""
        self._select_fields.append(expression)
        return self
    
    def distinct(self) -> 'SQLBuilder':
        """去重"""
        self._distinct = True
        return self
    
    def count(self, field: str = "*", alias: str = None) -> 'SQLBuilder':
        """计数"""
        expr = f"COUNT({field})"
        if alias:
            expr += f" AS {alias}"
        return self.select_raw(expr)
    
    def sum(self, field: str, alias: str = None) -> 'SQLBuilder':
        """求和"""
        expr = f"SUM({field})"
        if alias:
            expr += f" AS {alias}"
        return self.select_raw(expr)
    
    def avg(self, field: str, alias: str = None) -> 'SQLBuilder':
        """平均值"""
        expr = f"AVG({field})"
        if alias:
            expr += f" AS {alias}"
        return self.select_raw(expr)
    
    def max(self, field: str, alias: str = None) -> 'SQLBuilder':
        """最大值"""
        expr = f"MAX({field})"
        if alias:
            expr += f" AS {alias}"
        return self.select_raw(expr)
    
    def min(self, field: str, alias: str = None) -> 'SQLBuilder':
        """最小值"""
        expr = f"MIN({field})"
        if alias:
            expr += f" AS {alias}"
        return self.select_raw(expr)
    
    def join(self, table: str, on: str, 
            join_type: JoinType = JoinType.INNER,
            alias: str = None) -> 'SQLBuilder':
        """连接表"""
        table_expr = f"{table}" + (f" AS {alias}" if alias else "")
        self._joins.append(f"{join_type.value} {table_expr} ON {on}")
        return self
    
    def left_join(self, table: str, on: str, alias: str = None) -> 'SQLBuilder':
        """左连接"""
        return self.join(table, on, JoinType.LEFT, alias)
    
    def right_join(self, table: str, on: str, alias: str = None) -> 'SQLBuilder':
        """右连接"""
        return self.join(table, on, JoinType.RIGHT, alias)
    
    def where(self, condition: str, *params: Any) -> 'SQLBuilder':
        """添加WHERE条件"""
        self._where_conditions.append(condition)
        self._where_params.extend(params)
        return self
    
    def where_eq(self, field: str, value: Any) -> 'SQLBuilder':
        """等于条件"""
        return self.where(f"{field} = ?", value)
    
    def where_ne(self, field: str, value: Any) -> 'SQLBuilder':
        """不等于条件"""
        return self.where(f"{field} != ?", value)
    
    def where_gt(self, field: str, value: Any) -> 'SQLBuilder':
        """大于条件"""
        return self.where(f"{field} > ?", value)
    
    def where_gte(self, field: str, value: Any) -> 'SQLBuilder':
        """大于等于条件"""
        return self.where(f"{field} >= ?", value)
    
    def where_lt(self, field: str, value: Any) -> 'SQLBuilder':
        """小于条件"""
        return self.where(f"{field} < ?", value)
    
    def where_lte(self, field: str, value: Any) -> 'SQLBuilder':
        """小于等于条件"""
        return self.where(f"{field} <= ?", value)
    
    def where_like(self, field: str, pattern: str) -> 'SQLBuilder':
        """LIKE条件"""
        return self.where(f"{field} LIKE ?", pattern)
    
    def where_in(self, field: str, values: List[Any]) -> 'SQLBuilder':
        """IN条件"""
        placeholders = ", ".join("?" * len(values))
        return self.where(f"{field} IN ({placeholders})", *values)
    
    def where_not_in(self, field: str, values: List[Any]) -> 'SQLBuilder':
        """NOT IN条件"""
        placeholders = ", ".join("?" * len(values))
        return self.where(f"{field} NOT IN ({placeholders})", *values)
    
    def where_between(self, field: str, start: Any, end: Any) -> 'SQLBuilder':
        """BETWEEN条件"""
        return self.where(f"{field} BETWEEN ? AND ?", start, end)
    
    def where_null(self, field: str) -> 'SQLBuilder':
        """IS NULL条件"""
        return self.where(f"{field} IS NULL")
    
    def where_not_null(self, field: str) -> 'SQLBuilder':
        """IS NOT NULL条件"""
        return self.where(f"{field} IS NOT NULL")
    
    def where_exists(self, subquery: 'SQLBuilder') -> 'SQLBuilder':
        """EXISTS条件"""
        sub_sql = subquery._build_select()
        return self.where(f"EXISTS ({sub_sql.statement})", *sub_sql.parameters)
    
    def group_by(self, *fields: str) -> 'SQLBuilder':
        """GROUP BY"""
        self._group_by_fields.extend(fields)
        return self
    
    def having(self, condition: str, *params: Any) -> 'SQLBuilder':
        """HAVING条件"""
        self._having_conditions.append(condition)
        self._having_params.extend(params)
        return self
    
    def order_by(self, field: str, direction: OrderDirection = OrderDirection.ASC) -> 'SQLBuilder':
        """ORDER BY"""
        self._order_by.append(f"{field} {direction.value}")
        return self
    
    def order_by_desc(self, field: str) -> 'SQLBuilder':
        """降序排序"""
        return self.order_by(field, OrderDirection.DESC)
    
    def limit(self, limit: int) -> 'SQLBuilder':
        """LIMIT"""
        self._limit = limit
        return self
    
    def offset(self, offset: int) -> 'SQLBuilder':
        """OFFSET"""
        self._offset = offset
        return self
    
    def page(self, page: int, page_size: int) -> 'SQLBuilder':
        """分页"""
        self._limit = page_size
        self._offset = (page - 1) * page_size
        return self
    
    def for_update(self) -> 'SQLBuilder':
        """行锁"""
        self._lock_mode = "FOR UPDATE"
        return self
    
    def for_share(self) -> 'SQLBuilder':
        """共享锁"""
        self._lock_mode = "FOR SHARE"
        return self
    
    def with_cte(self, name: str, query: 'SQLBuilder') -> 'SQLBuilder':
        """CTE (Common Table Expression)"""
        sub_sql = query._build_select()
        self._ctes.append(f"{name} AS ({sub_sql.statement})")
        self._where_params[:0] = sub_sql.parameters
        return self
    
    def _build_select(self) -> SQLQuery:
        """构建SELECT语句"""
        parts = []
        params = []
        
        if self._ctes:
            parts.append(f"WITH {', '.join(self._ctes)}")
        
        select_clause = "SELECT "
        if self._distinct:
            select_clause += "DISTINCT "
        select_clause += ", ".join(self._select_fields)
        parts.append(select_clause)
        
        from_clause = f"FROM {self._main_table}"
        if self._main_alias:
            from_clause += f" AS {self._main_alias}"
        parts.append(from_clause)
        
        if self._joins:
            parts.extend(self._joins)
        
        if self._where_conditions:
            parts.append(f"WHERE {' AND '.join(self._where_conditions)}")
            params.extend(self._where_params)
        
        if self._group_by_fields:
            parts.append(f"GROUP BY {', '.join(self._group_by_fields)}")
        
        if self._having_conditions:
            parts.append(f"HAVING {' AND '.join(self._having_conditions)}")
            params.extend(self._having_params)
        
        if self._order_by:
            parts.append(f"ORDER BY {', '.join(self._order_by)}")
        
        if self._limit is not None:
            parts.append(f"LIMIT {self._limit}")
        
        if self._offset is not None:
            parts.append(f"OFFSET {self._offset}")
        
        if self._lock_mode:
            parts.append(self._lock_mode)
        
        return SQLQuery(
            statement=" ".join(parts),
            parameters=tuple(params)
        )
    
    def build(self) -> SQLQuery:
        """构建查询"""
        return self._build_select()


query = (SQLBuilder("users", "u")
    .select("u.id", "u.name", "u.email", "COUNT(o.id) AS order_count")
    .left_join("orders o", "u.id = o.user_id")
    .where_eq("u.status", "active")
    .where_like("u.name", "%张%")
    .where_gte("u.created_at", "2024-01-01")
    .group_by("u.id", "u.name", "u.email")
    .having("COUNT(o.id) > ?", 0)
    .order_by_desc("order_count")
    .page(1, 20)
    .build())

print(f"SQL: {query.statement}")
print(f"参数: {query.parameters}")

4.3.2 文档生成器

python
from typing import Optional, List, Dict, Any, Union
from dataclasses import dataclass, field
from abc import ABC, abstractmethod
from enum import Enum, auto

class DocumentFormat(Enum):
    MARKDOWN = "markdown"
    HTML = "html"
    PDF = "pdf"
    DOCX = "docx"


@dataclass
class DocumentSection:
    """文档章节"""
    title: str
    level: int
    content: str
    subsections: List['DocumentSection'] = field(default_factory=list)


@dataclass
class Document:
    """文档"""
    title: str
    author: str = ""
    date: str = ""
    sections: List[DocumentSection] = field(default_factory=list)
    metadata: Dict[str, Any] = field(default_factory=dict)
    
    def to_markdown(self) -> str:
        """转换为Markdown"""
        lines = [f"# {self.title}\n"]
        
        if self.author:
            lines.append(f"**作者**: {self.author}\n")
        if self.date:
            lines.append(f"**日期**: {self.date}\n")
        
        lines.append("\n---\n")
        
        for section in self.sections:
            lines.extend(self._section_to_markdown(section))
        
        return "\n".join(lines)
    
    def _section_to_markdown(self, section: DocumentSection, depth: int = 0) -> List[str]:
        lines = []
        prefix = "#" * (section.level + 1)
        lines.append(f"\n{prefix} {section.title}\n")
        
        if section.content:
            lines.append(section.content)
        
        for subsection in section.subsections:
            lines.extend(self._section_to_markdown(subsection, depth + 1))
        
        return lines


class DocumentBuilder:
    """
    文档建造者
    
    特性:
        - 支持层级结构
        - 多种输出格式
        - 模板支持
    """
    
    def __init__(self):
        self._title: str = ""
        self._author: str = ""
        self._date: str = ""
        self._sections: List[DocumentSection] = []
        self._current_section_stack: List[DocumentSection] = []
        self._metadata: Dict[str, Any] = {}
    
    def title(self, title: str) -> 'DocumentBuilder':
        self._title = title
        return self
    
    def author(self, author: str) -> 'DocumentBuilder':
        self._author = author
        return self
    
    def date(self, date: str) -> 'DocumentBuilder':
        self._date = date
        return self
    
    def metadata(self, key: str, value: Any) -> 'DocumentBuilder':
        self._metadata[key] = value
        return self
    
    def section(self, title: str, content: str = "") -> 'DocumentBuilder':
        """添加章节"""
        section = DocumentSection(
            title=title,
            level=len(self._current_section_stack) + 1,
            content=content
        )
        
        if self._current_section_stack:
            self._current_section_stack[-1].subsections.append(section)
        else:
            self._sections.append(section)
        
        return self
    
    def begin_section(self, title: str) -> 'DocumentBuilder':
        """开始章节"""
        section = DocumentSection(
            title=title,
            level=len(self._current_section_stack) + 1,
            content=""
        )
        
        if self._current_section_stack:
            self._current_section_stack[-1].subsections.append(section)
        else:
            self._sections.append(section)
        
        self._current_section_stack.append(section)
        return self
    
    def end_section(self) -> 'DocumentBuilder':
        """结束章节"""
        if self._current_section_stack:
            self._current_section_stack.pop()
        return self
    
    def paragraph(self, text: str) -> 'DocumentBuilder':
        """添加段落"""
        if self._current_section_stack:
            current = self._current_section_stack[-1]
            if current.content:
                current.content += "\n\n" + text
            else:
                current.content = text
        return self
    
    def code_block(self, code: str, language: str = "") -> 'DocumentBuilder':
        """添加代码块"""
        block = f"\n\n```{language}\n{code}\n```\n"
        if self._current_section_stack:
            current = self._current_section_stack[-1]
            current.content += block
        return self
    
    def list_items(self, *items: str) -> 'DocumentBuilder':
        """添加列表"""
        list_text = "\n\n" + "\n".join(f"- {item}" for item in items) + "\n"
        if self._current_section_stack:
            current = self._current_section_stack[-1]
            current.content += list_text
        return self
    
    def build(self) -> Document:
        if not self._title:
            raise ValueError("文档标题不能为空")
        
        return Document(
            title=self._title,
            author=self._author,
            date=self._date,
            sections=self._sections,
            metadata=self._metadata
        )


doc = (DocumentBuilder()
    .title("Python设计模式指南")
    .author("张三")
    .date("2024-01-15")
    .metadata("version", "1.0")
    .metadata("category", "技术文档")
    .begin_section("概述")
    .paragraph("设计模式是软件工程中的重要概念,它提供了可复用的解决方案。")
    .paragraph("本指南将介绍23种经典设计模式及其Python实现。")
    .end_section()
    .begin_section("创建型模式")
    .paragraph("创建型模式关注对象的创建过程。")
    .list_items("单例模式", "工厂方法模式", "抽象工厂模式", "建造者模式", "原型模式")
    .begin_section("单例模式")
    .paragraph("单例模式确保一个类只有一个实例。")
    .code_block("""
class Singleton:
    _instance = None
    
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance
""", "python")
    .end_section()
    .end_section()
    .build())

print(doc.to_markdown())

4.4 建造者模式 vs 工厂模式

4.4.1 核心区别

┌─────────────────────────────────────────────────────────────────┐
│                    建造者模式 vs 工厂模式                         │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  工厂模式                                                       │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │  关注点: 创建什么(What)                                 │   │
│  │  方式: 一次性创建完整对象                                 │   │
│  │  参数: 通过构造函数参数传递                               │   │
│  │  适用: 对象类型不确定,但创建过程简单                     │   │
│  │  示例: DatabaseFactory.create_connection("mysql")        │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
│  建造者模式                                                     │
│  ┌─────────────────────────────────────────────────────────┐   │
│  │  关注点: 如何创建(How)                                  │   │
│  │  方式: 分步骤构建对象                                     │   │
│  │  参数: 通过方法调用设置                                   │   │
│  │  适用: 创建过程复杂,有多个可选参数                       │   │
│  │  示例: ComputerBuilder().set_cpu("i9").set_ram("64GB")   │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

4.4.2 模式协作

建造者模式可以与工厂模式协作:

python
class ComputerFactory:
    """计算机工厂:根据用途选择合适的建造者"""
    
    @staticmethod
    def create_gaming_computer() -> Computer:
        builder = GamingComputerBuilder()
        director = ComputerDirector(builder)
        return director.build_high_end_gaming()
    
    @staticmethod
    def create_office_computer() -> Computer:
        builder = OfficeComputerBuilder()
        director = ComputerDirector(builder)
        return director.build_office_workstation()
    
    @staticmethod
    def create_custom_computer(builder: ComputerBuilder) -> Computer:
        return builder.get_result()

4.4.3 选择决策表

场景特征推荐模式
对象创建过程简单工厂模式
对象有多个可选参数建造者模式
需要分步骤构建建造者模式
需要验证构建约束建造者模式
需要构建不可变对象建造者模式
需要支持多种表示建造者模式 + Director
对象类型运行时决定工厂模式

4.5 反模式与最佳实践

4.5.1 常见反模式

反模式1:建造者过度使用

python
class SimpleObject:
    """简单对象不需要建造者"""
    def __init__(self, name: str, value: int):
        self.name = name
        self.value = value

class SimpleObjectBuilder:
    """过度设计:简单对象不需要建造者"""
    def name(self, name: str) -> 'SimpleObjectBuilder':
        self._name = name
        return self
    
    def value(self, value: int) -> 'SimpleObjectBuilder':
        self._value = value
        return self
    
    def build(self) -> SimpleObject:
        return SimpleObject(self._name, self._value)

obj = SimpleObject("test", 42)

反模式2:建造者状态污染

python
class BadBuilder:
    """错误示例:建造者持有可变状态"""
    
    def __init__(self):
        self._product = Product()
    
    def build(self) -> Product:
        return self._product

builder = BadBuilder()
builder.build()
builder.build()

正确做法

python
class GoodBuilder:
    """正确示例:每次构建创建新实例"""
    
    def __init__(self):
        self._reset()
    
    def _reset(self):
        self._product = Product()
    
    def build(self) -> Product:
        result = self._product
        self._reset()
        return result

4.5.2 最佳实践

python
from typing import TypeVar, Generic, Callable, List, Any

T = TypeVar('T')

class BuilderPattern:
    """
    建造者模式最佳实践
    
    原则:
        1. 建造者应该创建独立的产品实例
        2. 提供合理的默认值
        3. 在build()时验证约束
        4. 支持链式调用
        5. 考虑不可变性
    """
    pass

class BestPracticeBuilder(Generic[T]):
    """最佳实践建造者模板"""
    
    def __init__(self):
        self._validators: List[Callable[[T], bool]] = []
        self._transformers: List[Callable[[T], T]] = []
    
    def validate(self, validator: Callable[[T], bool]) -> 'BestPracticeBuilder':
        self._validators.append(validator)
        return self
    
    def transform(self, transformer: Callable[[T], T]) -> 'BestPracticeBuilder':
        self._transformers.append(transformer)
        return self
    
    def _validate_product(self, product: T) -> None:
        for validator in self._validators:
            if not validator(product):
                raise ValueError("产品验证失败")
    
    def _transform_product(self, product: T) -> T:
        for transformer in self._transformers:
            product = transformer(product)
        return product

4.6 模式评估与决策指南

4.6.1 适用性检查清单

检查项说明
对象有多个可选参数?✓ 使用✗ 评估参数复杂性
构建过程需要验证?✓ 使用✗ 评估约束检查
需要分步构建?✓ 使用✗ 评估构建流程
需要不可变对象?✓ 使用✗ 评估安全性需求
需要多种表示?✓ 使用✗ 评估变体支持

4.6.2 实现方式对比

实现方式优点缺点适用场景
经典建造者结构清晰、支持Director代码量大标准实现
流畅建造者API简洁、链式调用无Director简单场景
泛型建造者类型安全、可复用学习曲线框架开发
不可变建造者线程安全、缓存优化修改需重建并发场景

4.7 小结

建造者模式通过分步构建解决了复杂对象的创建问题:

┌─────────────────────────────────────────────────────────────────┐
│                    建造者模式决策树                              │
│                                                                 │
│                    对象创建是否复杂?                            │
│                         │                                       │
│              ┌──────────┴──────────┐                            │
│              ▼                     ▼                            │
│            是的                   不复杂                         │
│              │                     │                            │
│              ▼                     ▼                            │
│        需要多种表示?         直接构造函数                        │
│              │                                                  │
│      ┌───────┴───────┐                                          │
│      ▼               ▼                                          │
│     是              否                                           │
│      │               │                                          │
│      ▼               ▼                                          │
│  建造者+Director   流畅建造者                                     │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

关键要点

  1. 核心价值:分离构建与表示,支持分步构建
  2. 链式调用:提供流畅的API体验
  3. 验证机制:在构建时验证约束条件
  4. 不可变性:支持构建不可变对象
  5. Director角色:封装标准构建流程(可选)

在下一章中,我们将探讨原型模式,学习如何通过克隆创建对象。

Python技术丛书 - 江苏省宿城中等专业学校