建造者模式是一种对象创建型模式,它将客户端与包含多个部件的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分与装配方式,只需要知道所需建造者的类型即可。建造者模式关注如何逐步创建一个复杂的对象,不同的建造者定义了不同的创建过程,且具体建造者相互独立,且更换建造者和增加建造者非常的方便,系统具有较好的扩展性。

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

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

阿里云开发者
3.2k 声望6.3k 粉丝

阿里巴巴官方技术号,关于阿里巴巴经济体的技术创新、实战经验、技术人的成长心得均呈现于此。