建造者模式是一种创建型设计模式,用于将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。它允许客户端通过指定要构建的类型和可选参数来构建对象,而不需要了解对象的具体构建细节。
优点:
- 将构建过程封装在一个独立的构建者类中,使得客户端代码更加简洁和可读。
- 可以轻松地构建不同表示的对象,因为客户端只需指定不同的构建者即可。
- 提高了代码的灵活性,因为可以随时更改构建过程而不影响客户端。
缺点:
- 增加了代码的复杂性,因为需要定义多个构建者类。
- 如果产品类的属性较少或者变化不大,使用建造者模式可能会显得过度设计。
适用场景:
- 当对象拥有复杂的构建过程,且需要将构建过程与表示分离时。
- 当需要构建不同表示的同一类对象时。
- 当对象的构建过程需要独立于其组装方式时。
代码示例:
csharp
using System;
// 产品类
class Product
{
public string Part1 { get; set; }
public string Part2 { get; set; }
public string Part3 { get; set; }
public void Show()
{
Console.WriteLine($"Part1: {Part1}");
Console.WriteLine($"Part2: {Part2}");
Console.WriteLine($"Part3: {Part3}");
}
}
// 抽象建造者
interface IBuilder
{
void BuildPart1();
void BuildPart2();
void BuildPart3();
Product GetProduct();
}
// 具体建造者A
class ConcreteBuilderA : IBuilder
{
private Product product = new Product();
public void BuildPart1()
{
product.Part1 = "Part A1";
}
public void BuildPart2()
{
product.Part2 = "Part A2";
}
public void BuildPart3()
{
product.Part3 = "Part A3";
}
public Product GetProduct()
{
return product;
}
}
// 具体建造者B
class ConcreteBuilderB : IBuilder
{
private Product product = new Product();
public void BuildPart1()
{
product.Part1 = "Part B1";
}
public void BuildPart2()
{
product.Part2 = "Part B2";
}
public void BuildPart3()
{
product.Part3 = "Part B3";
}
public Product GetProduct()
{
return product;
}
}
// 指挥者
class Director
{
public void Construct(IBuilder builder)
{
builder.BuildPart1();
builder.BuildPart2();
builder.BuildPart3();
}
}
class Program
{
static void Main(string[] args)
{
Director director = new Director();
IBuilder builderA = new ConcreteBuilderA();
director.Construct(builderA);
Product productA = builderA.GetProduct();
Console.WriteLine("Product A:");
productA.Show();
IBuilder builderB = new ConcreteBuilderB();
director.Construct(builderB);
Product productB = builderB.GetProduct();
Console.WriteLine("\nProduct B:");
productB.Show();
}
}