有关工厂模式的问题
很多人说他们在项目中使用工厂模式。 但是当我真正看到它们的实现时,它看起来与我在第一本书中读到的定义完全不同。 在书中他们描述了两种工厂模式即
工厂方法 : – 类指定其子类,以根据某些参数指定要创建的对象。 所以我们期望这里有一些基类的抽象方法,这些方法将由子类和pupose实现,即创建一些对象
抽象工厂 : – 提供工厂(以接口或抽象工厂的forms),用于创建相关或依赖对象的族,而无需指定其具体类。
我在这里有一个问题,它们是指依赖或相关对象族的含义。 让我们参考http://www.apwebco.com/gofpatterns/creational/AbstractFactory.html 。 根据我的理解,这意味着在FinancialToolsFactory
(在链接中)能够创建TaxProcessor
,这是一系列产品,其中的实际concreate产品是CanadaTaxProcessor
和EuropeTaxProcessor
。 所以在这里我们将有n
个具体工厂(在这种情况下是CanadaFinancialToolsFactory
和EuropeFinancialToolsFactory
),它们将在这种情况下扩展/实现抽象工厂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。 这本身并非不合理。 问题是没有工厂模式 。
出现混乱有两个原因:
-
一些开发人员只想引入另一种模式并声称他们正在使用“工厂模式”,指的是创建其他模式的对象
-
了解设计模式的开发人员会看到一个类被称为工厂,无论模式是否已实现,并假设它必须是工厂方法或抽象工厂。 这是令人困惑的,因为你正在试图找出它是哪一个,质疑你自己对真实模式的理解。
请记住,设计模式不仅是常见问题的解决方案,而且还有助于建立讨论设计的语言。 在这种情况下,您期望的设计语言不是开发人员实际使用的语言。 如果他们说他们正在使用特定的设计模式,他们所做的只是错误的。
什么是依赖或相关对象的家庭意味着什么
使用四人帮的设计模式示例:
- AbstractFactory (
WidgetFactory
) - ConcreteFactory (
MotifWidgetFactory
,PMWidgetFactory
) - AbstractProduct (
Window
,ScrollBar
) - ConcreteProduct (
MotifWindow
,MotifScrollBar
,PMWindow
,PMScrollBar
)
public abstract class WidgetFactory {...}
public class MotifWidgetFactory extends WidgetFactory {...}
public class PMWidgetFactory extends WidgetFactory {...}
让我们从MotifWidgetFactory
开始。 它将生产一系列延伸或实施抽象产品的混凝土产品。 由于它们都是由同一家工厂建造的,因此它们可以很好地协同工作。 您不能使PMScrollBar
与MotifWindow
一起使用。
人们在工厂模式的名称上做的是……它看起来像一个实用程序类,我们传递类并获取对象实例。
您的示例是一个工厂,它生成一个对象。 在这种情况下,从Map
检索单例。 它不遵循“工厂方法”或“抽象工厂”模式,因此只是名义上的工厂。
只是观察与这个问题相关的’Java标签。 虽然本书与Java相关,但它与大多数OO语言的GOF设计模式“松散耦合”。
因此,该设计可能与其他语言相关。