设计模式中的抽象工厂方法

AbstractFactory method in DesignPattern

我正在 tutorialpoints 网站上学习 AbstractFactory 设计模式:http://www.tutorialspoint.com/design_pattern/abstract_factory_pattern.htm

我已经理解了基本概念。这里有两个疑惑。

  1. 我没有在那里使用 AbstractFactory class。当工厂是 AbstractFactory 类型时我们有什么优势。

  2. 而且为什么要用class呢?我们可以去 Interface 对吧?

我觉得这个例子有点令人困惑,因为你正在使用抽象工厂创建两个不同的项目(而且我不喜欢返回 null 值),也就是说:

有时您需要定义除生成所需类型的方法之外的其他行为。

让我们以该站点中使用的类似示例为例:

public abstract class AbstractShapeFactory{
   abstract Shape getShape(String shape) ;

   protected bool isShapeNameValid(String shapeName) {
       ...//Maybe you need to do some complex validation here.
          //For instance, `green` would not be a valid shape type.
   }
}

然后你像这样扩展它:

public class 2DShapeFactory extends AbstractShapeFactory {
     public Shape getShape(String shape) {
          super.isShapeNameValid();
          ... //Maybe some additional checks to see if the user really asked for a 2D shape.
          ....
     }
}

这将允许您保证给定的 class 实现了一系列方法(就像接口一样),但也可以节省您的时间,因为某些方法已经实现。

I didnt get the use of AbstractFactory class there. What advantage we got when the Factories are of AbstractFactory type.

当您的系统必须创建多个产品系列或者您想提供一个产品库而不公开实现细节时,您可以使用此模式。

此模式的关键特征:It will decouple the concrete classes from the client.

有关详细信息,请参阅下面的 SE 问题:

What is the basic difference between the Factory and Abstract Factory Patterns?

正在使用的抽象工厂的一个示例可以是 UI 工具包(跨越 Windows, Mac and Linux)。

但是,这些小部件的实现因平台而异。由于抽象工厂的实现,您可以编写一个独立于平台的客户端。

Moreover why to use class there? we can go for an Interface right?

接口无法实现抽象工厂模式的意图。使用接口,客户端需要知道合同。合同中的任何更改对客户都是可见的,这些更改可能会破坏客户端功能。但是抽象工厂将客户端与实现接口(工厂方法)

的具体 类 分离

以下文章有助于更好地理解

dzone文章

oodesign文章

sourcemaking文章