GRASP 之创建者Creator模式 - Kamil Grzybek

19-09-05 banq
                   

问题:谁创建对象A?

解决方案:如果下面情况其中一个为真,则为B类分配创建对象A的责任(越多越好)

  • - B包含或复合聚合A 
  • - B记录A 
  • - B密切使用A 
  • - B具有A 的初始化数据

例子:

public class Customer : Entity, IAggregateRoot 
{
    private readonly List<Order> _orders; 

    public void AddOrder(List<OrderProduct> orderProducts)
    {    
        var order = new Order(orderProducts); // Creator

        if (this._orders.Count(x => x.IsOrderedToday()) >= 2) 
        {
            throw new BusinessRuleValidationException("You cannot order more than 2 orders on the same day");
        }

        this._orders.Add(order);

        this.AddDomainEvent(new OrderAddedEvent(order));
    }
}

如上所示, Customer类综合聚合 Orders(没有Customer的订单),记录订单,密切使用Orders并初始化方法参数传递的数据。“订单创建者”的理想候选人。

(banq:在实际中在Customer中放入创建订单的责任不是一个好主意,还要结合单一职责,如果这个客户不只是创建订单,还做其他事情,都放在Customer中违背单一职责,而且Customer主要职责不是创建订单,而是维持自身客户信息。)