【问题标题】:Understanding the factory method pattern了解工厂方法模式
【发布时间】:2012-09-06 05:21:57
【问题描述】:

我正在阅读有关工厂方法模式的信息。

我可以理解何时有一个工厂类,即StoreFactory#getStore(),它基于某个运行时或其他状态返回一个Store 实现。

但是,从阅读(例如this link)来看,似乎人们创建一个抽象工厂类的一般模式,其他工厂类扩展到该类:

 public abstract class AbstractFactory {
     public abstract Store getStore(int store);
 }

 public class StoreFactoryA extends AbstractFactory {
     public Store getStore(int Store) {
         if(Store == 1) { return new MyStoreImplA(); }
         if(Store == 2) { return new MyStoreImplB(); }
     }
 }

 public class StoreFactoryB extends AbstractFactory {
     public Store getStore(int Store) {
         if(Store == 1) { return new MyStoreImplC(); }
         if(Store == 2) { return new MyStoreImplD(); }
     }
 }

 public class Runner {
    public static void main(String[] args) {
        AbstractFactory storeFactory = new StoreFactoryA();
        Store myStore = storeFactory.getStore(1);
    }
 }

我的示例是人为设计的,但模拟了上述链接的示例。

这个实现对我来说似乎有点像鸡蛋。使用工厂方法模式消除了客户端代码指定类类型的需要,但现在客户端代码需要选择性地选择要使用的正确工厂,即StoreFactoryAStoreFactoryB

这里使用抽象类的原因是什么?

【问题讨论】:

  • 你的例子有点太简单了。 abstract 工厂的意义在于,您可以 a) 在运行时选择整个工厂,然后 b) 使 那个 工厂产生整个对象集合。逻辑分组是最重要的。这可以防止您混合应该属于不同工厂并且实际上不可能同时出现的两种对象类型。
  • @KerrekSB:这应该是一个答案。
  • @casablanca:谢谢,虽然我认为 Sameer 的回答基本上是一样的,而且做得很好。
  • @KerrekSB:啊,看来他是在我发表评论后才发布的。 :)

标签: java design-patterns factory-pattern


【解决方案1】:

不幸的是,您正在阅读的链接没有给出该模式的实际示例。事实上,按照最初的 GoF 设计模式,这种模式被称为 Abstract Factory(工厂方法是不同的模式)。

当您拥有可以创建对象系列的工厂时,使用抽象工厂模式。例如您可以拥有 AbstractGUIFactorycreateButton(), createWindow(), createTitleBar 等方法。然后,您将拥有 WindowsGUIFactory, MacGUIFactory, MotifGUIFactory 等具体工厂,每个工厂都会以自己的方式生成 Button, Window, TitleBar 对象。

工厂将在应用程序的某个点设置为一种实现(可能使用配置),然后该工厂将用于需要创建对象的任何地方。

如果您正在学习设计模式,最好的建议是从经典的 GoF 书籍开始。

【讨论】:

  • 那里有很多相互矛盾的材料......让人很难理解什么是什么。在我的脑海里(使用过 DAO 模式),我想了很多。
【解决方案2】:

该模式变得有趣,尤其是在测试方面。现在您可以将AbstractFactory 注入到一个类中,并为不同的环境或测试选择不同的类型,而无需更改类(如果工厂创建共享公共接口的类型)。

使用类不必依赖于工厂的具体实现,也不必依赖于所创建类型的实际实现。

【讨论】:

    【解决方案3】:

    使用Factory方法时,方法还在对象中,需要实例化正确的对象才能访问方法。您实现的唯一抽象是因为 Abstract 类。

    工厂方法模式就是这样设计的。也许,您期望它类似于抽象工厂模式,它比工厂方法具有更好的抽象。

    http://c2.com/cgi/wiki?AbstractFactoryVsFactoryMethod

    【讨论】:

      【解决方案4】:

      您通过控制反转获得可扩展性和解耦,同时仍然允许对象对实际过程和时间进行控制。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-20
        相关资源
        最近更新 更多