首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解工厂方法模式

理解工厂方法模式
EN

Stack Overflow用户
提问于 2012-09-06 13:21:57
回答 4查看 837关注 0票数 4

我正在读一篇关于工厂方法模式的文章。

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

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

代码语言:javascript
复制
 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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-09-06 14:03:16

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

当您拥有能够创建对象的系列的工厂时,就会使用抽象工厂模式。例如,你可以有和AbstractGUIFactory,它们可以有createButton(), createWindow(), createTitleBar等方法。然后,你会有像WindowsGUIFactory, MacGUIFactory, MotifGUIFactory等具体的工厂,每个工厂都会以自己的方式产生Button, Window, TitleBar对象。

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

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

票数 4
EN

Stack Overflow用户

发布于 2012-09-06 13:28:26

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

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

票数 0
EN

Stack Overflow用户

发布于 2012-09-06 13:33:23

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

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

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

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

https://stackoverflow.com/questions/12293427

复制
相关文章

相似问题

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