工厂用静态方法实现

时间:2011-04-18 14:28:45

标签: design-patterns static factory factory-pattern abstract-factory

我已经看到使用静态方法实现Factory。像这样:

public class MyFactory {
    public static Product1 createProduct1() {}
    public static Product2 createProduct2() {}
}

p1 = MyFactory.createProduct1();
p2 = MyFactory.createProduct2();

我不确定我是否可以将其称为抽象工厂,但这不是问题。我对抽象工厂的理解是,它为我们提供了轻松更改产品系列的灵活性。

Factory factory = new MyFactory();  // might be a global or Singleton
p1 = factory.createProduct1();
p2 = factory.createProduct2();

如果我想从MyFactory更改为YourFactory,则只需更改一行。我也可以在运行时更改它。但它们是否可以作为静态方法实现?我需要将所有调用更改为静态工厂。如果我们想在运行时决定,还需要在每个地方使用if-else检查。

p1 = YourFactory.createProduct1();
p2 = YourFactory.createProduct2();

那么使用静态方法实现工厂的好处是什么?我们不是失去了主要的灵活性吗?我错过了什么?

请注意,不会假设使用特定语言。任何帮助表示赞赏。

5 个答案:

答案 0 :(得分:10)

使用这样的静态方法,您可以获得一些代码重用,但这是关于优势的程度。 它本质上将oo模式简化为程序范例。您错过的最重要的事情是根据上下文在运行时更改您的实现。

A singleton is only slightly better.它使您能够使用成员变量(状态)正常编写逻辑,然后进行一些调整以将其转换为单例。假设您在工厂中正在进行一些实例池化,单例可能非常适合。你仍然会错过上下文。

最灵活的模式是使用依赖性反转,这意味着您的类依赖于工厂抽象,并且不知道或不关心它是否是单例。这使您可以在供应混凝土工厂时考虑上下文。

答案 1 :(得分:3)

我打算说我看到使用这个工厂而不是通过new Product1()等实例化你的对象没有好处。

然而,这并不完全正确。您可以在使用此类工厂时为基类选择实现,这可能是他们实现它的原因。例如,createProduct1()方法可以实现为return new JumboProduct1();,其中JumboProduct1派生自Product1,其余代码将与此类政策决策隔离。不是很灵活,但我认为它会完成工作。

我会看这个问题的答案,看看这样的设置是否有其他用途,因为我现在想不出任何其他的东西。

答案 2 :(得分:1)

这里没有抽象工厂的好处。只有当该方法是Builder时,您才能将某些条件逻辑封装到createProductX()方法中。

答案 3 :(得分:1)

taskinoor, 由于多种原因,不建议在纯OO编程中使用静态方法。

  1. 您无法使用静态方法实现依赖注入。
  2. 编写单元测试用例非常困难,几乎不可能。就个人而言,当我开始编程时,我在使用静态方法实现UT时遇到了很多困难。
  3. 说过静态方法的好处很少 如果要创建一个在运行时趋于保持相同的库函数,静态方法是一个不错的选择。

    请在这里查看抽象工厂的实现。我认为不需要使用“静态”方法来实现抽象工厂。 http://www.dofactory.com/Patterns/PatternAbstract.aspx#_self1

答案 4 :(得分:0)

为简洁起见,如果要配置大量对象,则使用静态方法实例化对象是最干净的。例如,比较:

textObject = new TextUI("Code Example");
textObject.move(50, 80);
textObject.size(100, 200);

textObject = TextUI.make("Code Example").move(50, 80).size(100, 200);

将三行更改为一行使配置更清晰,线条更便携 - 只需更改一个变量名称。使用正确的IDE时,您还可以自动完成每个点,从而更容易编写新行并添加新属性。