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();
  • 相关阅读:
    day113-django-Form组件常用字段和参数
    day112-django-Form组件-ajax提交给后台的Form验证
    day110-django-中间件和(socket:wsgiref、uwsgi)
    day111-django-初识Form组件(验证登录信息)
    day109-django-多对多、session保存用户信息到数据库和从数据库获取用户信息
    day108-django-路由分发、动态路由、伪静态、根据名称反向生成url
    软件测试基础
    Python并发编程之:多进程
    进程介绍(理论部分)
    网络编程
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/12804061.html
Copyright © 2011-2022 走看看