【23种设计模式】建造者模式(Builder Pattern) .Net Core实现

文章目录

    • 简介
    • 实现
    • 来源

简介

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

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

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

何时使用:一些基本部件不会变,而其组合经常变化的时候。

如何解决:将变与不变分离开。

关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。

应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。

优点: 1、建造者独立,易扩展。 2、便于控制细节风险。

缺点: 1、产品必须有共同点,范围有限制。 2、如内部变化复杂,会有很多的建造类。

使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。

注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
【23种设计模式】建造者模式(Builder Pattern) .Net Core实现_第1张图片

Asp net Core 代码无处不是 Builder 模式,举例:配置建造 IConfigurationBuilder、通用主机 IHostBuilder、 配置中间件的:IApplicationBuilder等; 到处是 内置委托 Action 作为 函数的参数。

实现

在建造者模式中一般包含如下成分:

  • 抽象建造者:抽象建造者为创建复杂产品对象的各个部分指定抽象创建接口
  • 具体建造者:继承抽象建造者,实现抽象创建接口。指定创建的类型。创建各个具体的部分。
  • 产品角色:复杂产品对象,将各个部分组成产品的接口
  • 指挥者:调用各个部分,按固定的算法创建。不涉及到具体产品类的信息。仅负责各个部分完整的创建
  • 就组装电脑来说,我们一起看看建造者模式如何实现这一复杂对象的创建设计。
namespace Builder_Pattern
{
    public class BuilderPattern
    {
    }
    #region 产品角色——电脑的组成 ============
    public class Computer
    {
        private string Type = null;
        public Computer(string type)
        {
            this.Type = type;
        }
        private List<string> computer = new List<string>();
        public void Add(string part)
        {
            computer.Add(part);
        }

        public void Show()
        {
            Console.WriteLine("电脑组装正式开始:");
            foreach (var item in computer)
            {
                Console.WriteLine("配件——" + item + "已装好");
            }
            Console.WriteLine(Type + "电脑组装完成了");
        }
    }
    #endregion

    #region 抽象创建者——电脑中的各个部分的抽象接口============

    public abstract class Builder
    {
        /// 
        /// Cpu抽象创建
        /// 
        public abstract void CreateCpu();
        /// 
        /// 主板抽象创建
        /// 
        public abstract void CreateMotherboard();
        /// 
        /// 显卡抽象创建
        /// 
        public abstract void CreateGraphicsCard();
        /// 
        /// 获取组装好的电脑
        /// 
        /// 
        public abstract Computer GetComputer();

    }
    #endregion

    #region 具体产品创建者——联想电脑各个部分创建接口=========
    public class LenovoBuilder : Builder
    {
        Computer lenovo = new Computer("联想");
        public override void CreateCpu()
        {
            lenovo.Add("联想CPU");
        }
        public override void CreateMotherboard()
        {
            lenovo.Add("联想主板");
        }
        public override void CreateGraphicsCard()
        {
            lenovo.Add("联想显卡");
        }

        public override Computer GetComputer()
        {
            return lenovo;
        }
    }
    #endregion

    #region 具体产品创建者——惠普电脑各个部分创建接口=========
    public class HPBuilder : Builder
    {
        Computer hp = new Computer("惠普");
        public override void CreateCpu()
        {
            hp.Add("惠普CPU");
        }
        public override void CreateMotherboard()
        {
            hp.Add("惠普主板");
        }
        public override void CreateGraphicsCard()
        {
            hp.Add("惠普显卡");
        }

        public override Computer GetComputer()
        {
            return hp;
        }
    }
    #endregion

    #region 指挥者——固定的组装算法=================== 
    /// 
    /// 指挥者,其中的Construct是组装的较为固定算法
    /// 
    public class Commander
    {
        public void Construct(Builder builder)
        {
            builder.CreateMotherboard();
            builder.CreateCpu();
            builder.CreateGraphicsCard();
        }
    }
    #endregion
}
class Program
    {
        static void Main(string[] args)
        {
            //实例化指挥者
            Commander commander = new Commander();
            //指定具体产品
            Builder builder = new LenovoBuilder();
            //组装构建产品
            commander.Construct(builder);
            //构建完成展示产品
            Computer computer = builder.GetComputer();
            computer.Show();


            //指定具体产品
            builder = new HPBuilder();
            //组装构建产品
            commander.Construct(builder);
            //构建完成展示产品
            computer = builder.GetComputer();
            computer.Show();

            Console.ReadLine();
        }
    }

来源

建造者模式|菜鸟教程
通俗易懂设计模式解析——建造者模式

你可能感兴趣的:(开发,#,WEB_C#,设计模式,建造者模式,.netcore)