c#设计模式-创建性模式-2.建造者模式

Posted mr.chenyuelin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#设计模式-创建性模式-2.建造者模式相关的知识,希望对你有一定的参考价值。

建造者模式:将一个复杂对象将构造与其表示分离,使得同样构造过程创建不同表示

在这里插入图片描述
例子,一个车由窗户、引擎、车轮等等子物体构成,用户选择好对应的车子品牌之后,指导者就建造哪个牌子的车

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 建造者模式
{
    //指挥者,类似老板,可在客户端决定建造哪个牌子的车
    public class Director
    {
        public void Construct(Builder builder)
        {
            //一般都是有顺序的
            builder.BuildCarDoor();
            builder.BuildCarEngine();
            builder.BuildCarWheel();
        }
    }
    //汽车类,
    public sealed class Car
    {
        //存产品的子物件
        private List<string> parts = new List<string>();
        public void Add(string part)
        {
            parts.Add(part);
        }
        public void Show()
        {
            Console.WriteLine("汽车开始组装");
            foreach (string item in parts)
            {
                Console.WriteLine("组件" + item + "已装好");
            }
            Console.WriteLine("汽车组装好了");
        }
    }
    //抽象建造者
    public abstract class Builder
    {
        //装窗户
        public abstract void BuildCarDoor();
        //装车轮
        public abstract void BuildCarWheel();
        //装引擎
        public abstract void BuildCarEngine();
        //当然还有其它部件

        //获取组装好的汽车
        public abstract Car GetCar();
    }
    //具体建造者,别克
    public sealed class BuickBuilder : Builder
    {
        Car buickCar = new Car();
        public override void BuildCarDoor()
        {
            buickCar.Add("buick's Door");
        }
        public override void BuildCarEngine()
        {
            buickCar.Add("buick's Engine");
        }
        public override void BuildCarWheel()
        {
            buickCar.Add("buick's Wheel");
        }
        public override Car GetCar()
        {
            return buickCar;
        }
    }
    //
    public sealed class AoDiBuilder : Builder
    {
        Car aoDiCar = new Car();
        public override void BuildCarDoor()
        {
            aoDiCar.Add("AoDi's Door");
        }
        public override void BuildCarEngine()
        {
            aoDiCar.Add("AoDi's Engine");
        }
        public override void BuildCarWheel()
        {
            aoDiCar.Add("AoDi's Wheel");
        }
        public override Car GetCar()
        {
            return aoDiCar;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Director director = new Director();

            Builder buickBuilder = new BuickBuilder();            
            director.Construct(buickBuilder);
            Car buickCar = buickBuilder.GetCar();
            buickCar.Show();
            //我觉得上面的这个牌子不好开,换个牌子开
            Builder aoDiBuilder = new AoDiBuilder();
            director.Construct(aoDiBuilder);
            Car aodiCar = aoDiBuilder.GetCar();
            aodiCar.Show();
            Console.ReadKey();
        }
    }
}

用户是与指挥者交流的,然后指挥者再将具体的请求委派给具体的建造者去实现,客户并不知道产品的具体实现的。

为什么产品类并没有提炼出来一个抽象类,因为比如我这造自行车和造汽车所需要的零件能一样吗,许多方法都会不一样。

抽象工厂模式是“系列产品”的生产,如鼠标,键盘,都可以与电脑配套使用
而建造者模式是“产品部分”的生产,一个汽车需要很多零件,零件不可缺少,汽车少了轮胎能走吗,电脑少了键盘,我也能玩呀,虽然可玩性降低了

建造者模式的优点:

1.实例的构建具体到组件层次,方便控制细节;

2.具体的建造者相互独立,易于扩展。

3.客户不需要知道产品具体实现过程

建造者模式的缺点:

当组件的组合种类很多时,需要创建很多的具体建造者类。

以上是关于c#设计模式-创建性模式-2.建造者模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式——11.建造者模式

C# 设计模式巩固笔记 - 建造者模式

C#设计模式——建造者模式

C#设计模式-建造者模式

使用建造者模式创建模拟数据

设计模式从青铜到王者第八篇:创建型模式之建造者模式(BuilderPattern)