C# 语言 建造者模式的实践

C#阿木 发布于 5 天前 7 次阅读


C 建造者模式实践:构建复杂对象的最佳实践

在软件开发中,我们经常需要构建复杂的对象,这些对象可能包含多个属性,且这些属性之间可能存在依赖关系。直接使用构造函数来初始化这些对象可能会导致代码冗长且难以维护。为了解决这个问题,建造者模式(Builder Pattern)应运而生。建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

本文将围绕C语言,通过实践案例来展示如何使用建造者模式来构建复杂对象。

建造者模式概述

建造者模式是一种创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式通常包含以下角色:

- Builder:抽象建造者,定义了创建产品的各个步骤。
- ConcreteBuilder:具体建造者,实现Builder接口,提供产品的具体实现。
- Director:导演者,负责安排已有模块的构建过程。
- Product:产品类,表示将要创建的对象。

实践案例:构建一个复杂的订单对象

假设我们需要构建一个复杂的订单对象,该对象包含以下属性:

- 订单ID
- 客户信息
- 订单详情(包括商品名称、数量、价格等)

1. 定义产品类(Product)

csharp
public class Order
{
public int OrderId { get; set; }
public Customer Customer { get; set; }
public List Details { get; set; }

public Order()
{
Details = new List();
}
}

2. 定义抽象建造者(Builder)

csharp
public interface IOrderBuilder
{
void SetOrderId(int orderId);
void SetCustomer(Customer customer);
void AddOrderDetail(string productName, int quantity, decimal price);
Order Build();
}

3. 定义具体建造者(ConcreteBuilder)

csharp
public class OrderBuilder : IOrderBuilder
{
private Order _order;

public OrderBuilder()
{
_order = new Order();
}

public void SetOrderId(int orderId)
{
_order.OrderId = orderId;
}

public void SetCustomer(Customer customer)
{
_order.Customer = customer;
}

public void AddOrderDetail(string productName, int quantity, decimal price)
{
_order.Details.Add(new OrderDetail
{
ProductName = productName,
Quantity = quantity,
Price = price
});
}

public Order Build()
{
return _order;
}
}

4. 定义导演者(Director)

csharp
public class OrderDirector
{
private IOrderBuilder _builder;

public OrderDirector(IOrderBuilder builder)
{
_builder = builder;
}

public void Construct(int orderId, Customer customer, List details)
{
_builder.SetOrderId(orderId);
_builder.SetCustomer(customer);

foreach (var detail in details)
{
_builder.AddOrderDetail(detail.ProductName, detail.Quantity, detail.Price);
}
}
}

5. 使用建造者模式构建订单对象

csharp
public class Program
{
public static void Main(string[] args)
{
// 创建具体建造者
IOrderBuilder builder = new OrderBuilder();

// 创建导演者
OrderDirector director = new OrderDirector(builder);

// 构建订单
director.Construct(1, new Customer { Name = "张三" }, new List
{
new OrderDetail { ProductName = "苹果", Quantity = 10, Price = 5.5M },
new OrderDetail { ProductName = "香蕉", Quantity = 5, Price = 3.0M }
});

// 获取构建完成的订单
Order order = builder.Build();

// 输出订单信息
Console.WriteLine($"订单ID: {order.OrderId}");
Console.WriteLine($"客户: {order.Customer.Name}");
foreach (var detail in order.Details)
{
Console.WriteLine($"商品: {detail.ProductName}, 数量: {detail.Quantity}, 价格: {detail.Price}");
}
}
}

总结

通过以上实践案例,我们可以看到建造者模式在构建复杂对象时的优势。它将对象的构建过程与表示分离,使得代码更加清晰、易于维护。在实际项目中,我们可以根据需求灵活地使用建造者模式来构建各种复杂的对象。