了解工厂方法模式

时间:2012-09-06 05:21:57

标签: java design-patterns factory-pattern

我正在阅读工厂方法模式。

我可以理解什么时候有一个工厂类,即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);
    }
 }

我的例子是设计的,但模仿上述链接。

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

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

4 个答案:

答案 0 :(得分:4)

遗憾的是,您正在阅读的链接并未提供该模式的实际示例。实际上,根据原始的GoF设计模式,这种模式称为抽象工厂(工厂方法是一种不同的模式)。

当您拥有可以创建对象族的工厂时,将使用工厂模式。例如你可以拥有AbstractGUIFactory可以有方法createButton(), createWindow(), createTitleBar等等。然后,你会有像WindowsGUIFactory, MacGUIFactory, MotifGUIFactory等具体的工厂,每个工厂都会生成Button, Window, TitleBar个对象。办法。

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

工厂方法模式以这种方式设计。也许,你期望它类似于抽象工厂模式,它具有比工厂方法更好的抽象。

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

答案 3 :(得分:0)

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