【发布时间】:2015-07-14 20:51:06
【问题描述】:
出于测试的目的,我有一个Factory,它使用Builder 生成Products。每个Product 都可以有一个状态(Available/InUse/Disposed/ 等)。我需要生产各种状态的产品。
我的问题是,为了让我产生一个Product,比如说Disposed,它首先需要是InUse(必须使用new ProductBuilder().CheckIn().Dispose().Build();创建它,而不仅仅是new ProductBuilder().Dispose().Build();)
我如何(或必须?)为构建器方法强制执行此前提条件并保持圈复杂度为 1(因此不需要进一步测试) .
我不希望在每种可能的情况下都使用if (product.Status == Product.INUSE) {...} 和抛出exceptions 之类的东西(不同的状态需要不同的先决条件)。
由于构建器是私有的,我需要强制执行吗?我是否只是依靠程序员知道需要调用方法的顺序,并在每个构建器方法之前添加一些 cmets?我应该选择不同的模式(哪个?)。
public static class ProductFactory
{
private class ProductBuilder
{
private Product product;
public ProductBuilder()
{
product = new Product {Status = product.AVAILABLE};
}
public ProductBuilder Dispose()
{
product.Status = product.DISPOSED; return this;
}
public ProductBuilder CheckIn()
{
product.Status = product.INUSE; return this;
}
public Product Build()
{
return product;
}
}
public static Product CreateAvailable()
{
return new ProductBuilder().Build();
}
public static Product CreateInUse()
{
return new ProductBuilder().CheckIn().Build();
}
public static Product CreateDisposed()
{
return new ProductBuilder().CheckIn().Dispose().Build();
}
}
【问题讨论】:
-
这里使用构建器模式似乎没有太多好处。为什么不直接退货?
-
我同意@Enigmativity。没有太多要封装的。如果您想将构建器注入许多不同的客户端,构建器模式很有用 - 这里只有 一个 客户端,即工厂。
-
构建器内部的方法实际上有点复杂,我觉得有必要以某种方式提取它们,我希望能够在构建对象时使用构建器提供的流畅性。此外,在我的真实案例中,我需要通过组合相同的方法来获得更多状态(顺序很重要,提供不同的结果)。不过我会考虑你的建议...
标签: c# design-patterns methods builder prerequisites