天天看点

4.建造者模式(Builder Pattern)

建造者模式

在日常生活中有这样一个场景,我想要一台电脑,但是我又不想要自己买配件组装,于是找到一个店铺把找到满意的电脑下单,商家在收到我的订单之后,开始安排技术人员组装,组装好之后再把电脑寄过来。

对于一台电脑来说,里面包含CPU、主板、显卡、内存、硬盘、电源、机箱等等配置,可以把电脑当成一个复杂的对象,CPU,主板等电脑配件,又有很多种选择,但是组装电脑的过程基本是一样的,这时候就可以用建造者模式实现这一过程。

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

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

4.建造者模式(Builder Pattern)

我们来已创建一个水杯举例子,代码如下。

using System;

namespace _04_Builder
{
	/// <summary>
    /// 建造者
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            //小明要制作一个运动水杯
            Builder b1 = new SportCupBuilder();
            Director director = new Director(b1);
            director.Create();
            
            Cup cup = new Cup();
            cup.Drink();

            Console.ReadKey();
        }
    }
    public class Director
    {
        Builder b = null;
        public Director(Builder builder)
        {
            b = builder;
        }
        public void Create()
        {
            b.BuildString();
            b.BuildCap();
            b.BuildBody();
        }
    }
    //我想定制个水杯
    public abstract class Builder
    {
        public abstract void BuildString();
        public abstract void BuildCap();
        public abstract void BuildBody();
    }
    /// <summary>
    /// 运动水杯
    /// </summary>
    public class SportCupBuilder : Builder
    {
        public override void BuildString()
        {
            Console.WriteLine("经历一番工作把杯子绳做好了");
        }
        public override void BuildCap()
        {
            Console.WriteLine("杯盖做好了");
        }
        public override void BuildBody()
        {
            Console.WriteLine("杯子主体做好了");
        }
    }

    //这是我们要制作的水杯
    public class Cup
    {
        private string myString;//绳子
        private string body;  //主体
        private string cap;  //杯盖

        public string MyString
        {
            get { return myString; }
            set { myString = value; }
        }
        public string Body
        {
            get { return body; }
            set { body = value; }
        }
        public string Cap
        {
            get { return cap; }
            set { cap = value; }
        }
        public void Drink()
        {
            Console.WriteLine("喝水。。。吨吨吨");
        }
    }
}

           

如果说需要在创建另外的一种水杯,同样是又杯绳,杯盖,杯体组成的话,就可以仿照

SportCupBuilder

方法在写一个方法继承自

Builder

即可。