C#设计模式读书笔记之建造者模式(Builder Pattern)

26 篇文章 16 订阅

建造者模式(Builder Pattern)【使用频率:★★☆☆☆】

1. 概述

  将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。在建造者模式的定义中提到了复杂对象,那么什么是复杂对象?简单来说,复杂对象是指那些包含多个成员属性的对象。

建造者模式与抽象工厂模式有点相似,但是建造者模式返回一个完整的复杂产品,而抽象工厂模式返回一系列相关的产品;在抽象工厂模式中,客户端通过选择具体工厂来生成所需对象,而在建造者模式中,客户端通过指定具体建造者类型并指导Director类如何去生成对象,侧重于一步步构造一个复杂对象,然后将结果返回。如果将抽象工厂模式看成一个汽车配件生产厂,生成不同类型的汽车配件,那么建造者模式就是一个汽车组装厂,通过对配件进行组装返回一辆完整的汽车。

2. 模式中的角色

  2.1 建造者(Builder):为创建一个产品对象的各个部件指定抽象接口,控制建造的细节。

  2.2 具体建造者(ConcreteBuilder):实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。

  2.3 指挥者(Director):指挥并构造一个使用Builder接口的对象,控制建造的过程。

  2.4 产品(Product):表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

3. 模式解读:

  3.1 模式的类图

       3.2 代码实现:

 

创建一个人,这个人可以有不同的特点,可以是胖子,可以是瘦子,可以是高个子,也可以是矮个子。

using System;

namespace ConsoleApp2
{
    class Class7
    {
        public static void Main(string[] args)
        {
            PersonDirector dir = new PersonDirector(new ThinPersonBuilder());
            Person person = dir.BuildPerson();
            Console.WriteLine(person.Head);
            Console.WriteLine(person.Body);
            Console.WriteLine(person.Arm);
            Console.WriteLine(person.Leg);

            Console.ReadLine();
        }
    }

    // 要建造的产品
    public class Person
    {
        public string Head { get; set; }
        public string Body { get; set; }
        public string Arm { get; set; }
        public string Leg { get; set; }
    }

    // 定义创建者接口,实现者必须实现该接口中定义的所有抽象方法,防止实现者疏忽而遗漏某个部件的创建
    public abstract class Builder
    {
        protected Person Person { get; set; }
        public Builder()
        {
            Person = new Person();
        }

        // 建造头
        public abstract void BuildHead();
        // 建造身体
        public abstract void BuildBody();
        // 建造胳膊
        public abstract void BuildArm();
        // 建造腿
        public abstract void BuildLeg();

        // 返回生成好的对象,这是一个具体方法,每个子类都可以使用它来返回一个已经创建成功的对象
        public Person GetPerson()
        {
            return Person;
        }
    }

    // 建造者的具体实现,这里是要建造出一个瘦子
    public class ThinPersonBuilder : Builder
    {
        public override void BuildHead()
        {
            Person.Head = "瘦子的脑袋";
        }

        public override void BuildBody()
        {
            Person.Body = "瘦子的身体";
        }

        public override void BuildArm()
        {
            Person.Arm = "瘦子的胳膊";
        }

        public override void BuildLeg()
        {
            Person.Leg = "瘦子的腿";
        }

    }

    // 建造者的具体实现,这里是要建造出一个胖子
    public class FatPersonBuilder : Builder
    {
        public override void BuildHead()
        {
            Person.Head = "胖子的脑袋";
        }

        public override void BuildBody()
        {
            Person.Body = "胖子的身体";
        }

        public override void BuildArm()
        {
            Person.Head = "胖子的胳膊";
        }

        public override void BuildLeg()
        {
            Person.Head = "胖子的腿";
        }
    }

    // 建造者模式中的指挥者
    public class PersonDirector
    {
        Builder builder;
        public PersonDirector(Builder personBuilder)
        {
            builder = personBuilder;
        }

        // 指挥创建一个人的过程,并返回创建成功的产品
        public Person BuildPerson()
        {
            builder.BuildHead();
            builder.BuildBody();
            builder.BuildArm();
            builder.BuildLeg();

            return builder.GetPerson();
        }
    }
}

4. 模式优缺点

  4.1 优点

  • 用户只需要指定要建造的类型就可以得到它们,而具体的建造过程和细节不需要知道。
  • 建造代码与表示相分离,如果2要改变一个产品的内部表示,只要再定义一个新的具体的建造者就可以了。
  • 建造过程由指挥者来控制,建造细节由一个抽象类来控制,对于实现建造细节的具体类来说,不会遗漏某一个步骤。

  4.2 缺点

    以上例子说明,现在我要增加产品的一个细节,如把创建脚的过程也添加进来,看我们需要改哪些类。Buider,FatPersonBuilder,ThinPersonBuilder(甚至更多,如果你实现了TallPersonBuilder,ShortPersonBuilder等),PersonDirector,我们对修改也就开放了。

5. 适用范围

  • 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
  • 需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
  • 游戏开发中的开发角色管理系统、管理所有角色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值