代码之家  ›  专栏  ›  技术社区  ›  TheItalianJobless

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

  •  2
  • TheItalianJobless  · 技术社区  · 7 年前

    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

    我看到许多像我一样的人很难“把握”抽象工厂和工厂模式之间的具体区别。 http://www.oracle.com/technetwork/java/dataaccessobject-138824.html 我试图加深这个话题。

    1) 抽象工厂

    • 持久性类型的3个工厂类(每个类有3种方法用于获取DTO DAO)

    2) 工厂方法:

    • 可能我可以创建3个超类,从中扩展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 回复  |  直到 7 年前
        1
  •  2
  •   nairavs    7 年前

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

    工厂

    想象一下,你正在建造一座房子,你走近一个木匠拿窗户。你给出你的要求,他就会构建一个窗口。在这种情况下,木匠是一个窗户工厂。您的规格是工厂的输入,窗口是工厂的输出。

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

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

        2
  •  1
  •   Kedar Tokekar    7 年前

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

    1. 静态工厂:我们有什么样的方法

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

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

      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
          }
      }
      

      请记住,客户机代码是在之后编写的,以套件方形类型,当基类(根据所说的坐标进行面积计算)未编写时,该类型不存在。这种模式通常用于框架。

    3. 抽象工厂:这是

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

    同一接口可以由两个具体工厂实现,即 1.Filled ShapeCreator 2。HollowShapeCreator公司 这两个具体的创造者实现了从正方形/圆形延伸的具体形状的方法,如下所示

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