C# 设计模式系列教程-建造者模式

1. 概述

  将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。

2. 建造者模式中的角色

  2.1 建造者(Builder):为创建一个产品对象的各个部件指定抽象接口。
  2.2 具体建造者(ConcreteBuilder):实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。
  2.3 指挥者(Director):指挥并构造一个使用Builder接口的对象。
  2.4 产品(Product):表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

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

  3.1 以下是这个实例的类图,以及对类图的解读。

  3.2 代码实现及解读:

  // 要建造的产品
  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 ThinPersonBuilder()
    {
      Person = new Person();
    }

    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 PersonDirictor(Builder personBuilder)
    {
      builder = personBuilder;
    }

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

      return builder.GetPerson();
    }
  }

4. 模式总结

  4.1 优点

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

  4.2 缺点

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

  4.3 实用范围
    4.3.1 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

    4.3.2 当复杂对象的部件相对稳定,不会发生变化时

以上就是本文的全部内容,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C# 设计模式系列教程-桥接模式

    1. 概述 将抽象部分(Abstraction)与实现部分(Implementor)分离,使它们可以独立地变化. 2. 解决的问题 在软件系统中,有些类型由于自身的逻辑,它具有两个或多个维度的变化.为了解决这种多维度变化,又不引入复杂度,这就要使用Bridge模式. 3. 模式中的角色 2.1 抽象(Abstraction):定义抽象接口,该接口中包含实现具体行为.具体特征的Implementor接口. 2.2 提炼的抽象(RefinedAbstraction):继承自Abstraction的子

  • C# 设计模式系列教程-代理模式

    1. 概述 为其它对象提供一种代理以控制对这个对象的访问. 解决的问题:如果直接访问对象比较困难,或直接访问会给使用者或系统带来一系列问题.这样对于客户端(调用者)来说,就不需要直接与真实对象进行交互,解除了调用者与真实对象的耦合. 2. 模式中的角色 2.1 抽象实体(Subject):定义了真实实体(RealSubject)和代理(Proxy)的公共接口,这样就在任何时候使用真实实体(RealSubject)的地方使用代理(Proxy). 2.2 代理(Proxy):保存一个引用使得代理可以

  • C# 设计模式系列教程-装饰模式

    1. 概述 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活. 原理:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数.装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法.修饰类必须和原来的类有相同的接口. 2. 模式中的角色 2.1 抽象构建(Component):定义一个抽象接口,用以给这些对象动态地添加职责. 2.2 具体构建(ConcreteComponent):定义一个具体的对象,也可以

  • 详解C#的设计模式编程之抽象工厂模式的应用

    这里首先以一个生活中抽象工厂的例子来实现一个抽象工厂,然后再给出抽象工厂的定义和UML图来帮助大家更好地掌握抽象工厂模式,同时大家在理解的时候,可以对照抽象工厂生活中例子的实现和它的定义来加深抽象工厂的UML图理解.抽象工厂模式比其它工厂模式更加抽象,抽象工厂模式适用与多个抽象类的情况下,通过工厂返回多个抽象类中你需要得到的具体子类实例. 抽象工厂模式比其它工厂模式更加抽象,抽象工厂模式适用与多个抽象类的情况下,通过工厂返回多个抽象类中你需要得到的具体子类实例. 举例阐述抽象工厂模式: 假如中国

  • C# 设计模式系列教程-原型模式

    1. 概述 通过复制一个已经存在的实例来创建一个新的实例.被复制的实例被称为原型,这个原型是可定制的. 2. 模式中的角色 2.1 抽象原型类(Abstract Prototype):提供一个克隆接口 2.2 具体原型类(Concrete Prototype): 及实现了克隆接口的具体原型类 3. 实例:求职网站上现在都支持多份简历,如果每创建一份简历都要从头至尾地填写一遍,那也是非常让人沮丧的事.其实针对我们的求职岗位的不同,不同的简历可能只要修改局部内容就可以了,而不用全部重新构建一份新的简

  • C# 设计模式系列教程-单例模式

    1. 描述: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2. 单例模式主要有3个特点,: 2.1 单例类确保自己只有一个实例. 2.2 单例类必须自己创建自己的实例. 2.3 单例类必须为其他对象提供唯一的实例. 3. 实现方式:懒汉单例类和饿汉单例类 3.1 懒汉式单例类 对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备.它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果已有对象就不再创建,立即返

  • C# 设计模式系列教程-策略模式

    在讲策略模式之前,我先给大家举个日常生活中的例子,从首都国际机场到XXX酒店,怎么过去?1)酒店接机服务,直接开车来接.2)打车过去.3)机场快轨+地铁 4)机场巴士 5)公交车 6)走路过去(不跑累死的话) 等等.使用方法,我们都可以达到从机场到XXX酒店的目的,对吧.那么我所列出的从机场到XXX酒店的的方法,就是我们可以选择的策略. 再举个例子,就是我们使用WCF时,往往避免不了对它进行扩展,例如授权,我们可以通过自定义授权来扩展WCF.这里我们可以通过自定义AuthorizationPol

  • C# 设计模式系列教程-工厂方法模式

    1. 概述: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到子类. 2. 模式中的角色 2.1 抽象工厂(Creator):这个抽象类(或接口)声明一个创建对象的工厂方法,用来返回一个Product类型的对象. 2.2 具体工厂(ConcreteCreator):重定义工厂方法,返回一个具体的Concrete Product实例. 2.3 抽象产品(Product):定义工厂方法所创建的对象. 2.4 具体产品(ConcreteProduct): 具体产品,

  • C# 设计模式系列教程-抽象工厂模式

    1. 概述 抽象工厂模式为一个产品家族提供了统一的创建接口.当需要这个产品家族的某一系列的时候,可以从抽象工厂中选出相对应的系列来创建一个具体的工厂类别. 2. 抽象工厂模式中的角色 2.1 抽象工厂(AbstractFactory):担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的. 2.2 具体工厂(ConcreteFactory):这个角色直接在客户端的调用下创建产品的实例.这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的. 2.3 抽象产品

  • C# 设计模式系列教程-简单工厂模式

    1. 概述: 将一个具体类的实例化交给一个静态工厂方法来执行,它不属于GOF的23种设计模式,但现实中却经常会用到 2. 模式中的角色 2.1 工厂类(Simple Factory): 只包含了创建具体类的静态方法. 2.2 抽象产品(Product):定义简单工厂中要返回的产品. 2.3 具体产品(ConcreteProduct):具体产品. 3. 模式解读 3.1 简单工厂模式的一般化类图 3.2 简单工厂模式的代码实现 /// <summary> /// 简单工厂类,用sealed修饰,

随机推荐