在下面的示例中使用抽象工厂而不是工厂方法的真正好处是什么?

What are the real benefits of using the Abstract Factory in the following example, instead of the factory method?

在写问题之前我阅读了以下参考资料:

  1. Factory Method Vs Abstract Factory
  2. Abstract Factory vs Factory Method (scope)
  3. Abstract Factory, Factory Method, Builder
  4. Factory, Abstract Factory and Factory Method
  5. Differences between Abstract Factory Pattern and Factory Method

我看到很多像我一样的人都难以理解抽象工厂和工厂模式之间的具体区别"grasping"。 我不熟悉设计模式,我遇到了这个例子 http://www.oracle.com/technetwork/java/dataaccessobject-138824.html 并且我试图加深这个话题。

通过比较,我看到对于 3 个 DTO,我们有:

1) 抽象工厂

2) 工厂方法:

从代码量的角度来看,我没有看到任何实质性的差异。 在您需要添加新的持久性支持或新接口/DTO 的情况下,差异很小(并且是互补的)。

从客户的角度来看:

1) 抽象工厂:

public static final int PERSISTENCE_TYPE = DAOFactory.ORACLE;

DAOFactory daoFactory = DAOFactory.getDAOFactory(PERSISTENCE_TYPE);

CustomerDAO cDAO = daoFactory.getCustomerDAO();
AccountDAO aDAO = daoFactory.getAccountDAO();
OrderDAO oDAO = daoFactory.getOrderDAO();

2) 工厂方法:

public static final int PERSISTENCE_TYPE = DAOFactory.ORACLE;

CustomerDAO cDAO = CustomerDAOFactory.getCustomerDAO(PERSISTENCE_TYPE);
AccountDAO aDAO = AccountDAOFactory.getAccountDAO(PERSISTENCE_TYPE);
OrderDAO oDAO = OrderDAOFactory.getOrderDAO(PERSISTENCE_TYPE);

使用关于持久性类型的 DAOFactory 和 returns 所有与该支持相关的 DAO 而不是为每个 DTO 使用多个 DAOFactory 以获得所用持久性类型的 DAO 是否有优势?

目前我只看到使用抽象工厂的审美概念差异,是否还有我对软件设计的无知无法掌握的实用好处??

当我们说工厂设计模式时,伞下有三个版本。即

  1. Static Factory:我们有类似方法的地方

    Product getConcreteProduct(Key key){
        if (key.equals(key1) then {
            return ConcreteProduct1();
        } else {
            //... so on
        }
    

    在层次结构中将对象的创建集中在一起是很有用的。

  2. Factory Method : 这种模式理解起来有点困难,但关键是我们在抽象 class 中完成了业务逻辑(例如计算形状的参数)抽象产品(例如形状)。我们特意在此 class 中保留一个抽象方法来获取具体产品。

    abstract class GeometryMethod{
        void computeArea(){
            Shape shape getShape();
            // compute are
        }
        abstract Shape getShape();
    }
    

    将此通用计算保持开放状态以供客户根据其 Shape 定义重用是很有用的。客户可以延长

    Class CircleGeometry extends GeometryMethod{
        Shape getShape(){ // Factory Method
            return new Square(); // extending Shape
        }
    }
    

    请记住,客户端代码后来被写入套件 Square 类型,当未编写基础 class(根据所述坐标给出面积计算)时,该类型不存在。这种模式一般用于框架。

  3. 抽象工厂:这是工厂方法的一般情况。 假设我们有 Factory class,它可以创建形状并具有创建形状系列的抽象方法,如下所示

    abstract class ShapeCreator{
         abstract Square createSquare();
         abstract Circle createCircle();
         // ...
    }
    

相同的接口可以由两个具体的工厂实现,即 1. FilledShapeCreator 2. HollowShapeCreator 具体的创建者都实现了从 Square/Circle 扩展的具体形状的方法,如下所示

    class FilledShapeCreator{
         Square createSquare(){
             return new FilledSquare(); // extends Square
         }
         // ...
    }

基于特定的关键选择特定的混凝土工厂有助于提供不同风味的全系列产品。同样,这在定义业务逻辑时也更有用,无需指定产品系列的特定风格。

对先前答案的一个注释您可以阅读 Efecrive Java 第二版中的工厂方法。 但要想象模式之间在现实世界中的差异,请参阅: 例如

工厂

想象一下,您正在盖房子,然后您找了一个木匠做 window。你给出你的要求,他会构造一个 window 。在这种情况下,木匠是 windows 的一家工厂。您的规格是工厂的输入,window 是工厂的输出。

抽象工厂

现在,考虑 window 的相同示例。你可以去木匠那里,也可以去 window 商店或 PVC 商店。它们都是 window 个工厂。你根据情况决定你需要接近什么样的工厂。

所以结论 - 这取决于你解决的问题。