所以我不确定这是否是一个合法的工厂。我看到的大多数工厂在客户端都有这样的东西:
if(//something)
factory = new Type1Factory();
else
factory = new RegularFactory();
然后他们像factory.Create();
所以基本上检查你想要的工厂的条件是在调用代码中。我宁愿隐藏它并在工厂本身有条件,我想不再称之为工厂了?
这样的事情:
DateScheduleRequest request = new DateScheduleRequest();
DateScheduleBuilder dateScheduleBuilder = new DateScheduleBuilderFactory(request).Create();
dateScheduleBuilder
对象基本上属于某种类型,具体取决于发送给工厂构造函数的请求。
是否有另一种模式,或者这只是一种工厂的某种方式?
基本上,DateScheduleBuilder
将是一堆其他类型的构建器继承的父类,但我的调用代码知道这个抽象类有一个方法,并且它不需要知道请求类型,只需要将它传递给工厂并调用一个方法。
答案 0 :(得分:3)
我认为你在第二部分描述工厂模式。第一部分不是因为它依赖于调用者知道如何构建所需的对象。
在您的示例中,DateScheduleBuilderFactory
将能够知道如何解释request
对象中的信息并返回从DateScheduleBuilder
派生的对象。
简而言之,就像上面的Johm Dom所说的那样。你已经在那里......
答案 1 :(得分:1)
首先,第一个片段非常精细。我宁愿花时间添加功能,修复错误而不是重构错误。
如果我从头开始设计此代码,我会隐藏if
,例如在构造函数中。一个好的经验法则:“每当图书馆可以为消费者轻松做某事时,它就应该这样做。”
第三种选择是将if语句移动到vtable - polymorphism。
答案 2 :(得分:1)
你有什么是好的。
另一种方法是建立工厂。所以你有一个类,它有一个方法可以根据请求获得工厂实现(类似IDateScheduleBuilderFactory GetDateSceduleBuilderFactory(request)
,然后消费者在Create()
上调用IDateScheduleBuilderFactory
来获取构建器对象。 / p>
它稍微复杂但是意味着你有一个单一职责的班级(即一个班级的工作是将请求转变为正确的工厂类型,其他班级是实际不同类型的工厂)和你能够更容易地测试这个。现在,考虑到特定的要求,您将如何测试正确的工厂类型?您必须通过create的结果来确定,而不是仅仅检查GetDateSceduleBuilderFactory()
方法返回的类型。
您也可以让您当前的工厂公开一个像public bool CanHandleRequest(request)
这样的方法,它允许每个工厂决定它是否是特定请求的正确工厂,然后工厂工厂可以在其构造函数中接受一组工厂当调用GetDateSceduleBuilderFactory(request)
方法时,它可以循环遍历所有工厂,询问每个工厂是否可以处理请求,何时找到可以返回它的工厂。
这样做的好处是,当您添加新工厂时,您不需要更改任何逻辑,您可以只使用一些代码来获取所有通过反射实现接口的工厂,然后当您添加新工厂时,它们将会自动被拿起。
答案 3 :(得分:0)
严格来说,它不是工厂,因为它不使用类型来决定要创建哪个对象,但它是一种常见(且有用)的习惯用法,Head First Design Patterns书称它为简单工厂。
在我看来,这是完全合法的,并且在正确的地方非常有用(例如,如果制定策略),