4

所以我不确定这是否是一个合法的工厂。我看到的大多数工厂在客户端都有这样的东西:

if(//something)
    factory = new Type1Factory();
else
    factory = new RegularFactory();

然后他们通过像这样创建对象factory.Create();

所以基本上检查你想要哪个工厂的条件就在调用代码中。我宁愿隐藏它并在工厂本身拥有条件,我想这将不再被称为工厂?

像这样的东西:

DateScheduleRequest request = new DateScheduleRequest();
DateScheduleBuilder dateScheduleBuilder = new DateScheduleBuilderFactory(request).Create();

根据发送到工厂构造函数的请求,dateScheduleBuilder对象基本上属于某种类型。

是否有另一种模式,或者这只是一种做工厂的方式?

基本上,DateScheduleBuilder它将是一堆其他类型的构建器继承的父类,但我的调用代码知道这个抽象类有一个方法,它不需要知道请求类型,只需知道它的事实需要将其传递给工厂并调用一种方法。

4

4 回答 4

3

我认为您在第二部分中描述了工厂模式。第一部分不是因为它依赖于调用者知道如何构建所需的对象。在您的示例中,DateScheduleBuilderFactory将能够知道如何解释request对象中的信息并返回派生自DateScheduleBuilder.

简而言之,就像上面所说的 Johm Dom 一样。你已经在那里了...

于 2012-05-02T14:29:30.733 回答
1

首先,第一个片段非常好。我宁愿花时间添加功能,修复错误而不是重构它。

如果我从头开始设计这段代码,我会将ifeg 隐藏在构造函数中。一个好的经验法则:“只要图书馆可以为消费者轻松做某事,它就应该这样做”。

第三种选择是将 if 语句移动到 vtable - 多态性。

于 2012-05-02T14:33:56.683 回答
1

你有什么没问题。

另一种选择是拥有工厂工厂。所以你有一个类,它有一个基于请求获取工厂实现的方法(类似于IDateScheduleBuilderFactory GetDateSceduleBuilderFactory(request)然后消费者调用Create()IDateScheduleBuilderFactory获取构建器对象。

它稍微复杂一些,但意味着您有一个具有单一职责的类(即一个类的工作是将请求转换为正确类型的工厂,而其他类是实际不同类型的工厂),您将能够更容易地测试这一点。现在给定特定请求,您将如何测试是否使用了正确类型的工厂?您必须通过 create 的结果来确定这一点,而不仅仅是检查 GetDateSceduleBuilderFactory()方法返回的类型。

您还可以让您当前的工厂公开一个方法,例如public bool CanHandleRequest(request)允许每个工厂决定它是否是特定请求的正确工厂,然后工厂工厂可以在其构造函数中接受工厂集合,并且在GetDateSceduleBuilderFactory(request)调用该方法时它可以循环遍历所有工厂,询问每个工厂是否可以处理请求,并在找到可以处理请求的工厂时返回。

这样做的好处是,当您添加新工厂时,您不需要更改任何逻辑,您可以只使用一些代码来获取所有通过反射实现接口的工厂,然后当您添加新工厂时,它们将自动被选中向上。

于 2012-05-02T14:45:15.973 回答
0

严格来说,它不是工厂,因为它不使用类型来决定创建哪个对象,但它是如此常见(且有用)的习惯用法,以至于 Head First Design Patterns 书将其称为简单工厂。

在我看来这是完全合法的,并且在正确的地方非常有用(例如,如果创建策略),

于 2012-05-02T14:50:43.033 回答