将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示
个人理解:将一个复杂对象的构建过程抽象出来。当构造函数参数有多个,且这些参数可选,考虑使用建造者模式。因为它的构建过程比较复杂,抽出来会比较好
建造者模式与工厂模式的区别:两者都是用来创建对象,封装复杂创建过程,但是建造者模式可以让客户端参与建造过程
案例:使用ComputerBuilder创建Computer,Computer由多个部分组成,CPU、内存、鼠标、键盘...
public class Computer { private string _cpu = null; private string _memory = null; private string _mouse = null; private string _keybord = null; private Computer(ComputerBuilder builder) { this._cpu = builder.CPU; this._memory = builder.Memory; this._mouse = builder.Mouse; this._keybord = builder.Keybord; } public class ComputerBuilder { internal string CPU; internal string Memory; internal string Mouse = null; internal string Keybord = null; public ComputerBuilder(string CPU, string memory) { this.CPU = CPU; this.Memory = memory; } public ComputerBuilder SetMouse(string mouse) { this.Mouse = mouse; return this; } public ComputerBuilder SetKeybord(string keybord) { this.Keybord = keybord; return this; } public Computer Build() { return new Computer(this); } } }
客户端:
var builder = new Computer.ComputerBuilder("因特尔", "美光").SetMouse("罗技").SetKeybord("双飞燕"); Computer computer = builder.Build();
建造者模式还有一个好处就是,将创建过程抽象出来以后,我们可以使用不同的Builder创建对象,上面的程序只适用于单个Builder,需要修改一下
案例:
public interface IComputerBuilder { IComputerBuilder SetMouse(); IComputerBuilder SetKeybord(); Computer Build(); } public class HuipuComputerBuilder : IComputerBuilder { private Computer _computer = null; public HuipuComputerBuilder(string cpu, string memory) { _computer = new Computer(cpu, memory); } public IComputerBuilder SetMouse() { _computer.SetMouse("惠普鼠标"); return this; } public IComputerBuilder SetKeybord() { _computer.SetKeybord("惠普键盘"); return this; } public Computer Build() { return _computer; } } public class LianxiangComputerBuilder : IComputerBuilder { private Computer _computer = null; public LianxiangComputerBuilder(string cpu, string memory) { _computer = new Computer(cpu, memory); } public IComputerBuilder SetMouse() { _computer.SetMouse("联想鼠标"); return this; } public IComputerBuilder SetKeybord() { _computer.SetKeybord("联想键盘"); return this; } public Computer Build() { return _computer; } } public class Computer { private string _cpu = null; private string _memory = null; private string _mouse = null; private string _keybord = null; public Computer(string cpu, string memory) { this._cpu = cpu; this._memory = memory; } public void SetMouse(string mouse) { _mouse = mouse; } public void SetKeybord(string keybord) { _keybord = keybord; } }
客户端:
var huipuBuilder = new HuipuComputerBuilder("因特尔", "美光").SetMouse().SetKeybord(); Computer computer1 = huipuBuilder.Build(); var lianxiangBuilder = new HuipuComputerBuilder("高通", "紫光").SetKeybord(); Computer computer2 = lianxiangBuilder.Build();