4

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

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

但是,通过阅读(例如这个链接),似乎有一种人们创建抽象工厂类的一般模式,其他工厂类扩展到该类:

 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

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

4

4 回答 4

4

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

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

The factory will be set to one implementation at some point in the application (probably using configuration) and then that factory will be used wherever the objects need to be created.

If you are learning Design Patterns, the best advice is to start with the classic GoF book.

于 2012-09-06T06:03:16.350 回答
0

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

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

于 2012-09-06T05:28:26.480 回答
0

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

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

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

于 2012-09-06T05:33:22.547 回答
0

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

于 2012-09-06T05:43:16.227 回答