zoukankan      html  css  js  c++  java
  • 设计模式-建造者模式

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

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

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

    案例:使用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();
  • 相关阅读:
    OpenGL红宝书例子2.2 uniform变量的使用
    感冒了。。。
    OpenGL红宝书第一个例子:绘制两个三角形
    从今日起,我会把OpenGL红宝书上的例子用完整的代码形式写在我的博客中,
    win8.1下安装ubuntu 14.0 4LTS
    windows下编译Android版本的boost库文件
    cocos2d-x中使用tinyxml遇到的问题及解决
    为申请texturepacker用
    安装MSYS2过程遇到的问题及解决记录
    Lua 基础 -- 学习笔记
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/12804061.html
Copyright © 2011-2022 走看看