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)是一种创建型设计模式,用于创建复杂对象,同时可以提供灵活性和可读性。构造器模式具有以下优点和缺点:
优点:
-
创建复杂对象:构造器模式能够创建复杂的对象,通过将对象的构建过程分解为多个步骤,每个步骤由对应的构造器负责执行。这样可以将复杂的对象创建过程简化,提高代码的可读性和可维护性。
-
灵活性和可扩展性:构造器模式允许根据需要自由组合不同的构造器,以创建不同的对象。可以根据具体的需求来灵活地组合构造器,从而实现不同的组合方式和对象配置。
-
避免重叠构造函数:通过使用构造器模式,可以避免使用大量重叠的构造函数。构造器模式将对象的构建步骤拆分为多个独立的构造器,避免了构造函数的过多重载,提高了代码的可读性。
-
可读性和易用性:构造器模式提供了清晰的接口和方法来创建对象,使得代码更加可读和易于使用。通过方法链式调用的方式,可以更加直观地表达对象的构建过程。
缺点:
-
增加代码复杂性:构造器模式引入了多个构造器和步骤,这增加了代码的复杂性。如果对象的构建过程较为简单,使用构造器模式可能会显得过于繁琐。
-
增加了类的数量:使用构造器模式会增加类的数量,每个构造器对应一个具体的步骤。这可能会导致类的数量增多,增加了代码结构的复杂性。
-
对象创建过程不灵活:在构造器模式中,对象的构建过程是按照预定的步骤进行的,而且一旦开始构建,很难中途修改过程。如果需要根据运行时的条件来动态调整对象的创建过程,构造器模式可能不是最佳选择。
需要根据具体的应用场景和需求来评估使用构造器模式的利弊。构造器模式适用于需要创建复杂对象,并且需要提供灵活性和可读性的情况。通过权衡其优点和缺点,可以选择是否使用构造器模式。