有关工厂模式的问题

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

工厂方法 : – 类指定其子类,以根据某些参数指定要创建的对象。 所以我们期望这里有一些基类的抽象方法,这些方法将由子类和pupose实现,即创建一些对象

抽象工厂 : – 提供工厂(以接口或抽象工厂的forms),用于创建相关或依赖对象的族,而无需指定其具体类。

我在这里有一个问题,它们是指依赖或相关对象族的含义。 让我们参考http://www.apwebco.com/gofpatterns/creational/AbstractFactory.html 。 根据我的理解,这意味着在FinancialToolsFactory (在链接中)能够创建TaxProcessor ,这是一系列产品,其中的实际concreate产品是CanadaTaxProcessorEuropeTaxProcessor 。 所以在这里我们将有n个具体工厂(在这种情况下是CanadaFinancialToolsFactoryEuropeFinancialToolsFactory ),它们将在这种情况下扩展/实现抽象工厂FinancialToolsFactory

如果上述理解是正确的,请告诉我,因为我认为它是工厂模式的关键。

第二个问题:

人们对工厂模式名称的处理如下:

 public class MyFactory { public static  T getObject(Class 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的类,并获取该特定类的对象实例。 现在,如果我们按照开头(从第一本书)和其他网站描述的工厂模式的实际概念,它不遵循两种工厂模式中的任何一种。 对我来说,它看起来像一个实用程序类,我们传递类并获取对象实例。 如果你们同意这个,请告诉我?

您对Factory Method和Abstract Factory模式的理解是正确的。

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

出现混乱有两个原因:

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

  • 了解设计模式的开发人员会看到一个类被称为工厂,无论模式是否已实现,并假设它必须是工厂方法或抽象工厂。 这是令人困惑的,因为你正在试图找出它是哪一个,质疑你自己对真实模式的理解。

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

什么是依赖或相关对象的家庭意味着什么

使用四人帮的设计模式示例:

  • AbstractFactoryWidgetFactory
  • ConcreteFactoryMotifWidgetFactoryPMWidgetFactory
  • AbstractProductWindowScrollBar
  • ConcreteProductMotifWindowMotifScrollBarPMWindowPMScrollBar

public abstract class WidgetFactory {...}

public class MotifWidgetFactory extends WidgetFactory {...}

public class PMWidgetFactory extends WidgetFactory {...}

让我们从MotifWidgetFactory开始。 它将生产一系列延伸或实施抽象产品的混凝土产品。 由于它们都是由同一家工厂建造的,因此它们可以很好地协同工作。 您不能使PMScrollBarMotifWindow一起使用。

人们在工厂模式的名称上做的是……它看起来像一个实用程序类,我们传递类并获取对象实例。

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

只是观察与这个问题相关的’Java标签。 虽然本书与Java相关,但它与大多数OO语言的GOF设计模式“松散耦合”。

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