建造者模式是一种对象创立型模式,它将客户端与蕴含多个部件的简单对象的创立过程拆散,客户端毋庸晓得简单对象的外部组成部分与拆卸形式,只须要晓得所需建造者的类型即可。建造者模式关注如何逐渐创立一个简单的对象,不同的建造者定义了不同的创立过程,且具体建造者互相独立,且更换建造者和减少建造者十分的不便,零碎具备较好的扩展性。

1 | 建造者模式概述

无论是在事实世界中还是软件系统中,都存在一些简单的对象,他们领有多个组成部分(部件),例如汽车,它包含车轮、方向盘、发动机等多种部件。对于大多数用户而言,并不知道这些部件的拆卸细节,也简直不会应用独自某个部件,而是应用一辆残缺的汽车。
思考:面对下面这种场景,如何将这些部件组装成一辆残缺的汽车并返回给用户,而这种场景恰好就是建造者模式须要解决的问题。建造者模式能够将部件自身和它们的组装过程离开,关注如何一步步创立一个蕴含多个组成部分的简单对象,用户只须要指定简单对象的类型即可失去该对象,而无需晓得其外部的具体构建细节。

1.1 建造者模式的定义

• 建造者模式:将一个简单对象的构建与它的示意拆散,使得同样的构建过程能够创立不同的示意。
• Builder Pattern: Separate the construction of a complex object from its representation so that the same construction process can create different representations.
建造者模式是一种对象创立型模式,它将客户端与蕴含多个部件的简单对象的创立过程拆散,客户端毋庸晓得简单对象的外部组成部分与拆卸形式,只须要晓得所需建造者的类型即可。建造者模式关注如何逐渐创立一个简单的对象,不同的建造者定义了不同的创立过程,且具体建造者互相独立,且更换建造者和减少建造者十分的不便,零碎具备较好的扩展性。

2 | 建造者模式的构造与实现

2.1 建造者模式的构造

• (1) Builder(形象建造者):它为创立一个产品 Product 对象的各个部件指定形象接口,在该接口中个别申明两类办法,一类办法是 BuildPartX() (例如图6-2中的 BuildPartA()、BuildPartB() 等),它们用于创立简单对象的各个部件;另一类办法是GetResult(),它们用于返回简单对象。Builder既能够是抽象类,也能够是接口。
• (2) ConcreteBuilder(具体建造者):它实现了 Builder 接口,实现各个部件的具体结构和拆卸办法,定义并明确所创立的简单对象,还能够提供一个办法返回创立好的简单产品对象(该办法也可由形象建造者实现)。
• (3) Product(产品):它是被构建的简单对象,蕴含多个组成部件,具体建造者创立该产品的外部示意并定义它的拆卸过程。
• (4) Director(指挥者):指挥者又称为导演类,它负责安顿简单对象的建造秩序,指挥者与形象建造者之间存在关联关系,能够在其 Construct() 建造办法中调用建造者对象的部件结构与拆卸办法,实现简单对象的建造。客户端个别只须要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象(也能够通过配置文件和反射机制),而后通过指挥者类的构造函数或者 Setter 办法将该对象传入指挥者类中。

2.2 建造者模式的实现

在构建模式的定义中提到了简单对象,那什么是简单对象呢?简略来说,简单对象是指蕴含多个成员变量的对象,这些成员对象也称为部件或整机。举例:
• 汽车(简单对象)包含:方向盘,车灯,发动机,轮胎,座椅等部件;
• 电子邮件(简单对象)包含:发件人,收件人,主题,内容、附件等部件;
建造者模式的代码设计

using System;namespace BuilderPattern{    class Program    {        static void Main(string[] args)        {            Console.WriteLine("Hello BuilderPattern!");            {                Builder builder = new ConcreteBuilder1();                Director director = new Director(builder);                Product product = director.Construct(); //构建简单对象                Console.WriteLine($"【简单对象】=> PartA:{product.PartA},PartB:{product.PartB},PartC:{product.PartC}");            }        }    }    #region BuilderPattern-Demo    /// <summary>    /// 产品    /// </summary>    class Product    {        public string PartA { get; set; }        public string PartB { get; set; }        public string PartC { get; set; }    }    /// <summary>    /// 构建着 & 抽象类    /// </summary>    abstract class Builder    {        //创立产品对象        protected readonly Product product = new Product();        public abstract void BuildPartA();        public abstract void BuildPartB();        public abstract void BuildPartC();        /// <summary>        /// 返回产品对象        /// </summary>        /// <returns></returns>        public Product GetResult()        {            return product;        }    }    /// <summary>    /// 具体构建者    /// </summary>    class ConcreteBuilder1 : Builder    {        public override void BuildPartA()        {            product.PartA = "A1";        }        public override void BuildPartB()        {            product.PartB = "B1";        }        public override void BuildPartC()        {            product.PartC = "C1";        }    }    /// <summary>    /// 指挥者    /// </summary>    class Director    {        private Builder _builder;        public Director(Builder builder)        {            _builder = builder;        }        public void SetBuilder(Builder builder)        {            _builder = builder;        }        /// <summary>        /// 产品构建与组装办法        /// </summary>        /// <returns></returns>        public Product Construct()        {            _builder.BuildPartA();            _builder.BuildPartB();            _builder.BuildPartC();            return _builder.GetResult();        }    }    #endregion}

在指挥者类中能够注入一个形象建造者类型的对象,它提供了一个建造者办法 Construct() ,在该办法中调用了 builder 对象的结构部件的办法,最初返回一个产品对象。

文章内容残余60%,残缺内容请点击下方链接查看:
https://developer.aliyun.com/article/1181900#slide-0

版权申明:本文内容由阿里云实名注册用户自发奉献,版权归原作者所有,阿里云开发者社区不领有其著作权,亦不承当相应法律责任。具体规定请查看《阿里云开发者社区用户服务协定》和《阿里云开发者社区知识产权爱护指引》。如果您发现本社区中有涉嫌剽窃的内容,填写侵权投诉表单进行举报,一经查实,本社区将立即删除涉嫌侵权内容。