首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实例工厂方法与静态工厂方法

实例工厂方法与静态工厂方法
EN

Stack Overflow用户
提问于 2011-11-16 13:32:45
回答 5查看 36.4K关注 0票数 48

难道所有的工厂方法都不能是静态的吗?生产产品的东西需要状态吗?什么时候适合使用实例工厂或静态工厂方法?你能给我一些区分这两者的例子吗?

EN

回答 5

Stack Overflow用户

发布于 2012-12-09 07:20:38

假设您所说的“实例工厂方法”实际上是指GoF的“工厂方法”,那么“静态工厂方法”这个术语是由Joshua Bloch在他的书"Effective“中描述的。我在谷歌上搜索了一下这些网站:

http://sourcemaking.com/design_patterns/factory_method

  • Static工厂方法:http://www.informit.com/articles/article.aspx?p=1216151

  • 工厂方法

希望这有助于让区别变得更清晰一点。

听从马尔沃的建议:

  • 工厂方法,如GoF中所述:定义用于创建对象的接口,但让子类决定实例化哪个类。工厂方法允许类将实例化推迟到子类。

示例(Java代码):

代码语言:javascript
复制
    public abstract class Product { ... }

    public class ConcreteProduct extends Product { ... }

    public abstract class Creator {
      public void anOperation() { ... product = factoryMethod(); ... }
      public abstract Product factoryMethod();
    }

    public class ConcreteCreator extends Creator {
      public Product factoryMethod() { return new ConcreteProduct(); }
    }

  • 静态工厂方法:类可以提供一个公共的静态工厂方法,它只是一个返回类实例的静态方法。(...)静态工厂方法的一个优点是,与构造函数不同,它们有名称。(...)静态工厂方法的第二个优点是,与构造函数不同,它们不需要在每次调用时都创建一个新对象。(...)静态工厂方法的第三个优点是,与构造函数不同,它们可以返回其返回类型的任何子类型的对象。(...)只提供静态工厂方法的主要缺点是不能对没有公共或受保护构造函数的类进行子类化。

示例(Java代码):

代码语言:javascript
复制
    public class Boolean {
      ...
      public static Boolean valueOf(boolean b) {
        return b ? Boolean.TRUE : Boolean.FALSE;
      }
      ...
    }
票数 39
EN

Stack Overflow用户

发布于 2011-11-16 13:58:42

我目前的偏好是使工厂方法不是静态的,以便更容易测试。您不能在运行时更改静态工厂方法调用,而如果我可以为对象提供一个工厂实现,那么我就可以更彻底地测试它,因为我可以更好地控制上下文和对象图。

票数 12
EN

Stack Overflow用户

发布于 2011-11-16 13:42:02

如果你从你的工厂返回一个单例,那么你需要确保你只有一个实例,如果你每次调用工厂都要创建一个新的实例,那么就把它设为静态的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8147163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档