设计模式-建造者模式

建造者模式(Builder Pattern)是一种创建型设计模式,它将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。该模式适用于构建过程复杂且涉及多个步骤的场景,特别适合需要灵活配置的对象。

核心概念与角色​

  • ​产品(Product)​​
    最终构建的复杂对象,包含多个部件(如汽车、电脑、武器等)。
  • ​抽象建造者(Builder)​​
    定义构建产品各个部件的抽象接口(如BuildEngine()、BuildWheels())。
    ​* 具体建造者(ConcreteBuilder)​​
    实现抽象建造者的接口,提供部件构建的具体逻辑(如运动型汽车、普通房屋)。
    ​* 指挥者(Director)​​
    控制构建流程,按固定顺序调用建造者的方法完成对象组装(如汽车组装顺序:引擎→车轮→GPS)。

案例1:电脑组装(简化版建造者)​

// 产品:电脑
public class Computer {
    public string CPU { get; set; }
    public int Memory { get; set; }
    public int HardDisk { get; set; }
}

// 建造者类
public class ComputerBuilder {
    private Computer _computer = new Computer();

    public ComputerBuilder SetCPU(string type) {
        _computer.CPU = type;
        return this; // 链式调用
    }

    public ComputerBuilder SetMemory(int size) {
        _computer.Memory = size;
        return this;
    }

    public ComputerBuilder SetHardDisk(int capacity) {
        _computer.HardDisk = capacity;
        return this;
    }

    public Computer Build() => _computer;
}

// 客户端
var computer = new ComputerBuilder()
    .SetCPU("Intel i7")
    .SetMemory(16)
    .SetHardDisk(512)
    .Build();

通过链式调用逐步配置对象,代码简洁。
适用于部件较少的对象,省略了指挥者角色。

案例2:武器锻造(完整建造者模式)​

// 产品:武器
public class Weapon {
    private List<string> _parts = new List<string>();
    public void AddPart(string part) => _parts.Add(part);
    public void Show() => Console.WriteLine("武器部件: " + string.Join(", ", _parts));
}

// 抽象建造者
public abstract class WeaponBuilder {
    public abstract void BuildBlade();
    public abstract void BuildHandle();
    public abstract Weapon GetWeapon();
}

// 具体建造者:剑
public class SwordBuilder : WeaponBuilder {
    private Weapon _sword = new Weapon();
    public override void BuildBlade() => _sword.AddPart("剑刃");
    public override void BuildHandle() => _sword.AddPart("剑柄");
    public override Weapon GetWeapon() => _sword;
}

// 指挥者
public class Blacksmith {
    public Weapon Forge(WeaponBuilder builder) {
        builder.BuildBlade();
        builder.BuildHandle();
        return builder.GetWeapon();
    }
}

// 客户端
var blacksmith = new Blacksmith();
var sword = blacksmith.Forge(new SwordBuilder());
sword.Show(); // 输出:武器部件: 剑刃, 剑柄

严格分离构建步骤与表示,支持扩展新武器类型(如AxeBuilder)。
指挥者统一控制构建流程,避免客户端直接依赖具体建造者。

posted @ 2020-04-29 19:05  .Neterr  阅读(164)  评论(0)    收藏  举报