在某些时候,我们会出现复杂对象。我们传统的创建方式就是直接new一个对象,或者在构造函数中加一些属性来进行创建。但是在某些特殊情况下,我们需要将它的构建和表示分开,使得同样的构建过程可以创建不同的表示。

 

 

 看看图中的各个角色

  • 抽象的Builder,它定义了复杂对象构建的抽象。
  • Builder抽象的实现ConcreteBuilder,它可能不止一个,它对Builder中的构建进行了实现,复杂对象的每一部分到底具体是怎么构建的都在这里实现
  • Director顾名思义,它将告诉具体怎么将对象的每个部分组装起来

例如一台电脑,它由很多个零件组成,比如主板、cpu、内存、显卡、电源等。但是有的cpu自带集显,所以在某些情况下电脑可能不需要再外接显卡了。这个时候一台电脑就可能有不同的表示,这个时候它的构建就可能会有多种方式,那么我们分别构建这几个角色

先构建电脑对象

class Computer
{
    public string MotherBoard{get;set;}
    public string Cpu{get;set;}
    public string Graphics{get;set;}
    public string Memory{get;set;}
    public string Power{get;set;}
    public string Box{get;set;}
}
View Code

 

上述电脑的差异可能是在显卡上面,那么可以将电脑的构建分为两步,一步是主板部分的构建可能涉及到显卡差异,一部分是机箱部分的构建。抽象Builder

abstract class Builder
{
    public abstract BuilderA();

    public abstract BuilderB();

    public abstract GetComputer();
}
View Code

根据实际情况来具体实现构建步骤,也就是实现ConcreteBuilder

public class BuilderWithGraphics : Builder
{
    private Computer computer = new Computer();

    public override BuilderA(){
        //当然中间也可以添加一些构造逻辑
        computer.MotherBoard = "MSI";
        computer.Cpu = "R3500";
        computer.Graphics = "1060";
        computer.Memory = "8G";
    }

    public override BuilderB(){
        computer.Power = "600W";
        computer.Box = "ATX";
    }

    public override GetComputer()
    {
        return computer;
    }
}

public class BuilderWithoutGraphics : Builder
{
    private Computer computer = new Computer();

    public override BuilderA(){
        //当然中间也可以添加一些构造逻辑
        computer.MotherBoard = "MSI";
        computer.Cpu = "6700k";
        computer.Memory = "8G";
    }

    public override BuilderB(){
        computer.Power = "400W";
        computer.Box = "ATX";
    }

    public override GetComputer(){
        return computer;
    }
}
View Code

按照标准方法,组装电脑应该是先装主板再装机箱,所以这里会有一个构建先后的顺序。我们可以使用Director来实现这个情况

public class Director
{
    public Computer Construct(Builder builder){
        builder.BuilderA();
        builder.BuilderB();
    }
}
View Code

 

最后建构我们需要的对象

public static void Main()
{
    Director director = new Director();
    BuilderWithGraphics builder1 = new BuilderWithGraphics();
    BuilderWithoutGraphics builder2 = new BuilderWithoutGraphics();

    director.Construct(builder1);
    Computer computerWithGraphics = builder1.GetComputer();
    
    director.Construct(builder2);
    Computer computerWithoutGraphics = builder2.GetComputer();
}
View Code

总的来说,Builder抽象将对象的构建分为了几个部分。而Builder的实现则是具体实现了这个对象不同部分的具体构建。Director则是声明了这几个部分的组成方法。

这样我们就用不同构建方式将同一个类型构建出了不同的表示。该模式一般在复杂对象的创建,并且其创建过程有依赖,或者创建出来的对象有多种表示的情况下使用。
我能想到的是系统中某些对象的一些属性可能会根据系统配置的不同而有不同的表示的时候。

 

 posted on 2020-05-21 22:28  aohost  阅读(102)  评论(0)    收藏  举报