BuilderPattern-构造器模式

在C#中,构造器模式(Builder Pattern)是一种创建型设计模式,用于创建一个复杂对象的过程,并将其分解为多个简单步骤进行创建。与其他创建型模式(如工厂模式)不同,构造器模式着重于对象的构建过程,而不是直接创建对象。

构造器模式通常由以下几个关键组件组成:

产品类(Product):表示构造器模式中所要创建的复杂对象的最终产物。产品类通常包含多个属性,这些属性在构造过程中逐步赋值。

构造器接口(Builder):定义了创建产品的各个步骤,包含各种构建方法来设置产品的属性。通常还要有一个获取产品的方法。

具体构造器类(Concrete Builder):实现了构造器接口,并负责实际的产品构建过程。在每个构造方法中设置产品的属性。

指导类(Director):负责组织构造器的调用顺序,指导具体构造器类如何构建产品。

class ComputerPackage
{
    public string CPU { get; set; }
    public string RAM { get; set; }
    public string Storage { get; set; }
}
// 产品类
class Computer
{
    public Computer(ComputerPackage computerPackage)
    {
        this.computerPackage = computerPackage;
    }
    public ComputerPackage computerPackage { get; set; }
    public string Brand { get; set; }
}
// 构造器接口
abstract class IComputerBuilder
{
    public abstract void SetCPU();
    public abstract void SetRAM(string ram);
    public abstract void SetStorage(string storage);
    public abstract Computer GetComputer();
}
// 具体构造器类
class LenovoComputer : IComputerBuilder
{
    private ComputerPackage computerPackage = new ComputerPackage();
    public override void SetCPU()
    {
        computerPackage.CPU = "Intel Core i7";
        Console.WriteLine("{0} build CPU {1}", this.GetType().Name, computerPackage.CPU);
    }

    public override void SetRAM(string ram)
    {
        computerPackage.RAM = ram;
        Console.WriteLine("{0} build RAM {1}", this.GetType().Name, ram);
    }

    public override void SetStorage(string storage)
    {
        computerPackage.Storage = storage;
        Console.WriteLine("{0} build RAM {1}", this.GetType().Name, storage);
    }

    public override Computer GetComputer()
    {
        SetCPU();
        Console.WriteLine("{0} 组装 {1} {2} {3}", this.GetType().Name, computerPackage.CPU, computerPackage.RAM, computerPackage.Storage);
        return new Computer(computerPackage)
        {
            Brand = "联想"
        };
    }
}
class MacComputer : IComputerBuilder
{
    private ComputerPackage computerPackage = new ComputerPackage();
    public override void SetCPU()
    {
        computerPackage.CPU = "M1";
        Console.WriteLine("{0} build CPU {1}", this.GetType().Name, computerPackage.CPU);
    }

    public override void SetRAM(string ram)
    {
        computerPackage.RAM = ram;
        Console.WriteLine("{0} build RAM {1}", this.GetType().Name, ram);
    }

    public override void SetStorage(string storage)
    {
        computerPackage.Storage = storage;
        Console.WriteLine("{0} build RAM {1}", this.GetType().Name, storage);
    }

    public override Computer GetComputer()
    {
        SetCPU();
        Console.WriteLine("{0} 组装 {1} {2} {3}", this.GetType().Name,computerPackage.CPU, computerPackage.RAM, computerPackage.Storage);
        return new Computer(computerPackage)
        {
            Brand = "苹果"
        };
    }
}
class Director
{
    private IComputerBuilder builder = null;
    public Director(IComputerBuilder builder)
    {
        this.builder = builder;
    }

    public Computer BuildComputer()
    {
        builder.SetRAM("16GB");
        builder.SetStorage("1TB SSD");
        return builder.GetComputer();
    }
}
static void Main(string[] args)
{
    IComputerBuilder builder = new LenovoComputer();
    Director director = new Director(builder);
    Computer computer = director.BuildComputer();
    Console.WriteLine($"CPU: {computer.computerPackage.CPU}");
    Console.WriteLine($"RAM: {computer.computerPackage.RAM}");
    Console.WriteLine($"Storage: {computer.computerPackage.Storage}");

    IComputerBuilder builder1 = new MacComputer();
    Director director1 = new Director(builder1);
    Computer computer1 = director1.BuildComputer();
    Console.WriteLine($"CPU: {computer1.computerPackage.CPU}");
    Console.WriteLine($"RAM: {computer1.computerPackage.RAM}");
    Console.WriteLine($"Storage: {computer1.computerPackage.Storage}");

    Console.Read();
}

 构造器模式将对象构建过程代码从上端代码中剥离,上端代码不需要知道对象构建的过程,只需要拿到想要的对象即可。

 

构造器模式(Builder Pattern)是一种创建型设计模式,用于创建复杂对象,同时可以提供灵活性和可读性。构造器模式具有以下优点和缺点:

优点:

  1. 创建复杂对象:构造器模式能够创建复杂的对象,通过将对象的构建过程分解为多个步骤,每个步骤由对应的构造器负责执行。这样可以将复杂的对象创建过程简化,提高代码的可读性和可维护性。

  2. 灵活性和可扩展性:构造器模式允许根据需要自由组合不同的构造器,以创建不同的对象。可以根据具体的需求来灵活地组合构造器,从而实现不同的组合方式和对象配置。

  3. 避免重叠构造函数:通过使用构造器模式,可以避免使用大量重叠的构造函数。构造器模式将对象的构建步骤拆分为多个独立的构造器,避免了构造函数的过多重载,提高了代码的可读性。

  4. 可读性和易用性:构造器模式提供了清晰的接口和方法来创建对象,使得代码更加可读和易于使用。通过方法链式调用的方式,可以更加直观地表达对象的构建过程。

缺点:

  1. 增加代码复杂性:构造器模式引入了多个构造器和步骤,这增加了代码的复杂性。如果对象的构建过程较为简单,使用构造器模式可能会显得过于繁琐。

  2. 增加了类的数量:使用构造器模式会增加类的数量,每个构造器对应一个具体的步骤。这可能会导致类的数量增多,增加了代码结构的复杂性。

  3. 对象创建过程不灵活:在构造器模式中,对象的构建过程是按照预定的步骤进行的,而且一旦开始构建,很难中途修改过程。如果需要根据运行时的条件来动态调整对象的创建过程,构造器模式可能不是最佳选择。

需要根据具体的应用场景和需求来评估使用构造器模式的利弊。构造器模式适用于需要创建复杂对象,并且需要提供灵活性和可读性的情况。通过权衡其优点和缺点,可以选择是否使用构造器模式。

posted @ 2023-08-08 22:40  ZHIZRL  阅读(34)  评论(0编辑  收藏  举报