2011-08-26 64 views
7

很多人说他们在他们的项目中使用工厂模式。但是当我真正看到他们的实现时,它看起来完全不同 从定义我已经读过头第一本书。在这本书中,他们描述了两种工厂模式即关于工厂模式的问题

工厂方法: - 类指定其子类来指定哪些 对象基于一些参数来创建。所以我们在这里希望在基类中的一些 抽象方法whihich将通过该子 类和章节目标实现将是创建一些对象

抽象工厂: - 提供一个工厂(在接口或 抽象的形式工厂),用于创建相关或依赖对象的家庭 而不指定其具体的类。

我这里有什么?他们的家庭依赖或相关 对象的意思的问题。让我们参考http://www.apwebco.com/gofpatterns/creational/AbstractFactory.html。根据我的理解,这意味着在FinancialToolsFactory(在链接中)能够创建TaxProcessor,这是一个产品系列,其中真正的混凝土产品是CanadaTaxProcessorEuropeTaxProcessor。所以在这里我们将有n具体工厂的数量(在这种情况下为CanadaFinancialToolsFactoryEuropeFinancialToolsFactory),这将在这种情况下延伸/实施抽象工厂FinancialToolsFactory

请让我知道,如果上述理解是正确的,我认为它是工厂模式的关键。

第二个问题:

人都在做的工厂模式的名称是什么如下:

public class MyFactory 
{ 
    public static <T> T getObject(Class<T> cls) 
    { 
     if (cls == null) 
     { 
      throw new IllegalArgumentException("Invalid className"); 
     } 

     T daoObject = (T)map.get(cls); 

     if (daoObject == null) 
     { 
      daoObject = loadObject(cls); 
     } 

     return daoObject; 
    } 
} 

他们只是从main方法传递类像Example.class和获取的对象实例那个特定的类。 现在,如果我们按照开始时描述的工厂模式的实际概念(来自第一本书)和其他网站,它不会遵循两种工厂模式中的任何一种。对我来说,它看起来像一个工具类,我们正在传递类并获取对象实例。 如果你同意这个,请让我知道吗?

+0

Javadoc是否说这是这些书中解释的经典工厂模式的实现? –

+0

我同意100%回答第二个问题。这是一个“懒加载注册表”,而不是“工厂” –

回答

7

您对工厂方法和抽象工厂模式的理解是正确的。

当人们创建只负责创建其他对象的类时,他们自然倾向于将它们命名为Factory。这本身并不是不合理的。问题是没有工厂模式

混乱就出现在这里的原因有两个:

  • 一些开发商只是想在另一种模式抛出,并声称他们正在使用的“工厂模式”,指的是创建其他对象

  • 了解设计模式的开发人员可以看到,一个类被称为工厂,无论模式是否实现,并且假定它必须是工厂方法或抽象工厂。这是令人困惑的,因为当时你试图弄清楚它是哪一个,使人对自己对真实模式的理解产生怀疑。

请记住,设计模式不仅是解决常见问题的解决方案,而且它们有助于建立讨论设计的语言。在这种情况下,您所期望的设计语言并不是开发人员实际使用的。如果他们说他们正在使用特定的设计模式,他们所做的只是错误的。

+0

谢谢derekerdmann。如果你可以表达你对这个问题的想法,即他们的家属是依赖的还是相关的对象,那么它会是伟大的还是你同意我说的依赖或相关的对象家族? –

+0

因此,假设我有一个带有一个方法的类,该方法接受一个字符串,并且返回一个由字符串给定的类的实例,以及传递给构造函数的参数的一些参数,这些参数是否通过反射分类为Factory模式? –

+0

@Mohit Gupta - 是的,你的理解是正确的。 – derekerdmann

2

它们意味着什么家人依赖性或相关对象

由四人帮运用Design Patterns一个例子:

  • AbstractFactoryWidgetFactory
  • ConcreteFactoryMotifWidgetFactoryPMWidgetFactory
  • AbstractProductWindowScrollBar
  • ConcreteProductMotifWindowMotifScrollBarPMWindowPMScrollBar

public abstract class WidgetFactory {...}

public class MotifWidgetFactory extends WidgetFactory {...}

public class PMWidgetFactory extends WidgetFactory {...}

让我们从MotifWidgetFactory开始。它将生产一系列扩展或实施抽象产品的混凝土产品。由于它们都是由同一家工厂建造的,所以它们一起玩耍。您无法使用MotifWindowPMScrollBar合作。

人们对工厂模式的名称做了什么以下...它看起来像一个工具类,我们正在传递类和获取对象实例。

您的示例是一个工厂,它生成一个对象。在这种情况下,从Map中检索单例。它不遵循“工厂方法”或“抽象工厂”模式,因此只是名称上的工厂。

0

只是对与这个问题相关的Java标记的观察。尽管本书与Java相关,但它与GOF设计模式“大致耦合”,与大多数O-O语言相似。

该设计因此可能与其他语言有关。