创建一个c#工厂

时间:2012-05-02 14:22:36

标签: c# .net design-patterns factory

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

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

然后他们像factory.Create();

一样创建对象

所以基本上检查你想要的工厂的条件是在调用代码中。我宁愿隐藏它并在工厂本身有条件,我想不再称之为工厂了?

这样的事情:

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

dateScheduleBuilder对象基本上属于某种类型,具体取决于发送给工厂构造函数的请求。

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

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

4 个答案:

答案 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书称它为简单工厂。

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