设计模式-建造者模式

将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示

个人理解:将一个复杂对象的构建过程抽象出来。当构造函数参数有多个,且这些参数可选,考虑使用建造者模式。因为它的构建过程比较复杂,抽出来会比较好

 建造者模式与工厂模式的区别:两者都是用来创建对象,封装复杂创建过程,但是建造者模式可以让客户端参与建造过程

案例:使用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();
原文地址:https://www.cnblogs.com/fanfan-90/p/12804061.html