当前位置: 首页 > 知识库问答 >
问题:

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

魏臻
2023-03-14

在写问题之前,我阅读了以下参考文献:

  1. 工厂方法与抽象工厂
  2. 抽象工厂与工厂方法(范围)
  3. 抽象工厂、工厂方法、建设者
  4. 工厂、抽象工厂和工厂方法
  5. 抽象工厂模式与工厂方法的区别

我看到许多像我一样的人很难“理解”抽象工厂和工厂模式之间的具体区别。我不熟悉设计模式,我遇到了这个例子http://www.oracle.com/technetwork/java/dataaccessobject-138824.html我正在努力深化这个话题。

通过比较,我发现对于3 DTO,我们有:

1) 抽象工厂

  • 1个抽象类(具有3个抽象方法和3个开关案例);
  • 持久性类型的3个工厂类(每个都有3种获取DTO DAO的方法)
  • 3个接口和9个DAO。

2) 工厂方法:

  • 3个工厂级,每个接口一个(每个带有3个开关箱)
  • 可能我可以创建3个超类,从中扩展DAO类,以避免重复代码,例如用于连接数据库的超类
  • 3个接口和9个DAO

从代码数量的角度来看,我没有看到任何实质性的差异。在需要添加新的持久性支持或新的接口/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并返回与该支持相关的所有DAO而不是为每个DTO使用多个DAOFactory来获取所使用的持久性类型的DAO是否有优势?

目前,我只看到了使用抽象工厂在美学概念上的差异,是否还有一个实用的好处,因为我对软件设计的无知而无法理解??

共有2个答案

姚烨
2023-03-14

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

>

  • 静态工厂:我们有类似的方法

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

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

    工厂方法:这种模式不难理解,但关键是我们只根据抽象产品(例如形状)在抽象类中完成业务逻辑(例如,计算形状参数)。我们有意在这个类中保留一个抽象方法,以获得具体的产品。

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

    保持这种通用计算的开放性,以便客户端根据其形状定义进行重用,这是非常有用的。客户可以通过

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

    请记住,客户机代码是在没有编写基类(根据所说的坐标进行面积计算)时编写的,它是不存在的。这种模式通常用于框架。

    抽象工厂:这是工厂方法的一般情况。假设我们有一个工厂类,它可以创建形状,并有抽象方法来创建形状族,如下所示

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

    相同的接口可以由两个混凝土工厂实现,即1。FilledShapeCreator 2。HollowShapeCreator两个混凝土创建者都实现了从方形/圆形扩展的混凝土形状的方法,如下所示

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

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

  • 卢景澄
    2023-03-14

    在之前的answear中,您可以阅读Efecrive Java第二版中的工厂方法。但要想象现实世界中不同模式之间的差异,请参见:例如

    工厂

    想象一下,你正在建造一座房子,你向木匠要一扇窗户。你给出你的要求,他会建造一扇窗户。在这种情况下,木匠是窗户的工厂。你的规格是工厂的输入,窗户是工厂的输出。

    抽象工厂

    现在,考虑窗口的相同示例。你可以去木匠那里,也可以去橱窗店或PVC店。他们都是窗户工厂。根据情况,你决定你需要接近哪种工厂。

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

     类似资料:
    • 问题内容: 我看到许多像我一样的人难以“抓住”抽象工厂和工厂模式之间的具体差异。我对设计模式不熟悉,我遇到了这个示例http://www.oracle.com/technetwork/java/dataaccessobject-138824.html,并且我正在尝试加深主题。 通过比较,我发现对于3个DTO,我们有: 1)抽象工厂 1个抽象类(带有3个抽象方法和3个切换用例); 3种持久性类型的工

    • 抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。

    • 工厂-创建对象而不向客户机公开实例化逻辑,并通过公共接口引用新创建的对象。是工厂方法的简化版本 工厂方法-定义一个创建对象的接口,但让子类决定实例化哪个类,并通过公共接口引用新创建的对象。 抽象工厂-提供了创建相关对象家族的接口,而无需显式指定它们的类。 null

    • 在一个具有(控制器-服务-DAO-实体层)的spring hibernate Java项目中,我使用了抽象工厂模式(抽象类有2个抽象方法)。在实现的抽象工厂模式类中,我有dao方法(运行命名查询)。现在,当请求到达来自另一个服务类的dao的服务impl时,它给出了空指针删除,我已经在服务impl中自动连线了dao类` 我不能将@Service(“AbstractFruitService”)添加到S

    • 在抽象工厂模式中,涉及的主要实体是 抽象基地工厂 混凝土工厂每个延伸抽象基地工厂 客户端代码 基础产品 扩展基础产品的具体产品类别 我看过各种实现,并观察到客户机代码了解具体的工厂。根据我在不同地方看到的模式的共同定义,如下所示 定义一个用于创建对象的接口,但让子类来决定要实例化哪个类。 根据我的观察,是作为抽象工厂方法中的抽象方法实现的。它公开了一个非抽象的公共方法,比如,从中调用方法。根据具体

    • 本文向大家介绍iOS类工厂方法是什么 ?相关面试题,主要包含被问及iOS类工厂方法是什么 ?时的应答技巧和注意事项,需要的朋友参考一下 类工厂方法的实现是为了向客户提供方便,它们将分配和初始化合在一个步骤中,返回被创建的对象,并 进行自动释放处理。这些方法的形式是+ (type)className...(其中 className不包括任何前缀)。 工厂方法可能不仅仅为了方便使用。它们不但可以将分配