欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式-建造者模式详解

程序员文章站 2022-05-15 14:15:20
一、建造者模式的概念 建造者模式属于创建型设计模式。 指的是将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 建造者模式主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的 ......

一、建造者模式的概念

  建造者模式属于创建型设计模式。

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

  建造者模式主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

  建造者模式主要涉及几个角色:

  1、指挥者(director),负责和客户(client)对话

  2、之后指挥者将客户的产品需求划分为比较稳定的建造过程(abstractbuilder)

  3、指挥者指挥具体的建造者(concretebuilder)干活

  4、获取建造者建造的产品给客户

  比如组装电脑这个场景,cpu、主板、硬盘和内存等配件是相对稳定的,组装过程也是相当稳定的,先装cpu、内存、硬盘和电源等等(abstractbuilder),但是配件搭配的方式是多变的(builder可以多个),如组装家用电脑、游戏电脑。

二、建造者模式的实现

  1、先来一个产品类(电脑)

namespace builderpattern
{
    using system;
    using system.collections.generic;

    /// <summary>
    ///     电脑类
    /// </summary>
    public class computer
    {
        /// <summary>
        ///  电脑组件集合
        /// </summary>
        private readonly ilist<string> parts = new list<string>();

        /// <summary>
        /// 把单个组件添加到电脑组件集合中
        /// </summary>
        /// <param name="part">组件</param>
        public void add(string part)
        {
            this.parts.add(part);
        }

        public void show()
        {
            console.writeline("电脑组件清单:");
            foreach (var part in this.parts)
            {
                console.writeline($"组件:{part}");
            }

            console.writeline("****************");
        }
    }
}

  2、再来一个抽象builder、两个具体的builder

namespace builderpattern
{
    /// <summary>
    ///     抽象建造者
    /// </summary>
    public abstract class abstractbuilder
    {
        /// <summary>
        /// 装cpu
        /// </summary>
        public abstract void buildpartcpu();

        /// <summary>
        /// 装主板
        /// </summary>
        public abstract void buildpartmainboard();

        /// <summary>
        /// 获得组装好的电脑
        /// </summary>
        /// <returns>电脑</returns>
        public abstract computer getcomputer();
    }
}
namespace builderpattern
{
    /// <summary>
    ///     具体建造者,具体的某个人为具体创建者,例如:装机小王
    /// </summary>
    public class concretebuilder1 : abstractbuilder
    {
        private readonly computer computer = new computer();

        public override void buildpartcpu()
        {
            this.computer.add("cpu1");
        }

        public override void buildpartmainboard()
        {
            this.computer.add("main board1");
        }

        public override computer getcomputer()
        {
            return this.computer;
        }
    }
}
namespace builderpattern
{
    /// <summary>
    ///     具体建造者,具体的某个人为具体创建者,例如:装机小李啊
    /// </summary>
    public class concretebuilder2 : abstractbuilder
    {
        private readonly computer computer = new computer();

        public override void buildpartcpu()
        {
            this.computer.add("cpu2");
        }

        public override void buildpartmainboard()
        {
            this.computer.add("main board2");
        }

        public override computer getcomputer()
        {
            return this.computer;
        }
    }
}

  3、指挥者登场(boss)

namespace builderpattern
{
    /// <summary>
    ///   指挥者
    /// </summary>
    public class director
    {
        /// <summary>
        /// 组装电脑
        /// </summary>
        /// <param name="abstractbuilder">建造者</param>
        public void construct(abstractbuilder abstractbuilder)
        {
            abstractbuilder.buildpartcpu();
            abstractbuilder.buildpartmainboard();
        }
    }
}

  3、使用

namespace builderpattern
{
    using system;

    class program
    {
        static void main(string[] args)
        {
            // 客户找到电脑城老板说要买电脑,这里要装两台电脑
            // 创建指挥者和构造者
            var director = new director();
            abstractbuilder b1 = new concretebuilder1();
            abstractbuilder b2 = new concretebuilder2();

            console.writeline("开始组装第一台电脑");
            director.construct(b1);
            console.writeline("获取第一台电脑");
            var computer1 = b1.getcomputer();
            computer1.show();

            console.writeline("开始组装第二台电脑");
            director.construct(b2);
            console.writeline("获取第二台电脑");
            var computer2 = b2.getcomputer();
            computer2.show();

            console.read();
        }
    }
}

结果如下:

设计模式-建造者模式详解

三、总结

  以上组装电脑的过程,把电脑零件和电脑组装分离了,电脑组装和电脑组装过程分离了,也就是我们常说的解耦

  boss可以随时修改电脑的组装过程,不影响交付给客户的产品;也可以随时换掉组装电脑的人(concretebuilder1和concrebuilder2),不再依赖具体的人。也就是不依赖细节,都依赖于抽象,使整个电脑组装过程更稳定。

  建造者模式适用于所创建的产品具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,如造飞机和装电脑。