工厂类优于其他多态的好处

时间:2014-06-03 03:35:51

标签: java polymorphism factory

我正试图弄清楚Java中工厂类的目的。无论我到哪里,它的目的都是

  1. 创建对象而不将创建逻辑暴露给客户端
  2. 使用通用接口引用新创建的对象
  3. 示例显示了一个界面,例如

    public interface Shape {
        void draw();
    }
    

    使用一些实现此接口的具体类,例如

    public class Circle implements Shape {
       @Override
       public void draw() {
          // Draw circle
       }
    }
    

    和工厂,例如

    public class ShapeFactory {
       public Shape getShape(String shapeType){
          if(shapeType.equalsIgnoreCase("CIRCLE")){
             return new Circle();
          }
          // implement other types of shape
          return null;
       }
    }
    

    工厂的使用类似于:

    Shape shape1 = shapeFactory.getShape("CIRCLE");
    

    我的问题是:这比仅使用没有工厂的纯多态性更好,例如:

    Shape shape1 = new Circle();
    

    在我看来,这就像工厂一样实现了通用界面。我不太确定“隐藏创建逻辑”的好处是什么,当创建圆的创建逻辑与创建工厂的创建逻辑完全相同时。

5 个答案:

答案 0 :(得分:0)

使用工厂的主要好处是它们提供的抽象形式甚至比典型的继承更大。例如:

工厂如何制作该物品?

是否分配了新对象?它是否访问池,以节省资源?使用工厂,可能永远不会使用'new'关键字,从而节省了内存和/或GC开销。工厂可以执行构造函数通常不应执行的操作,例如进行远程执行调用或访问数据库。有时,工厂将返回一个Future实例,这意味着它可以在并行线程中进行实际处理!

工厂来自哪里?

你自己实施了工厂吗?从图书馆导入工厂?它是通过某种形式的IoC注入的吗? http://en.wikipedia.org/wiki/Inversion_of_control

总结,使用工厂是因为它们几乎是生产某种东西的最终抽象形式

答案 1 :(得分:0)

是的,这是他们给你的一个非常糟糕的例子。工厂模式与多态性关系不大,更多的是与最小化使用" new"关键字。

假设我建立了一个名为Manager的类。当我构建它时,它需要Stringint,因为它所管理的只是一个Person对象,具有名称和年龄。

但是当我增加我的应用程序时,我最终希望对新类型的数据进行操作,例如向我的人员添加一个职业领域。我希望我的经理能够在其构造函数中使用Enum以及Stringint来接收职业。

然后一年后,我的应用程序增长了很多,我有人的子类,数据访问对象,以及我需要传递给我的经理的各种数据。如果我没有使用工厂,那么在我实例化Manager类的代码中的ANYWHERE,我必须修复构造函数。

如果我使用ManagerFactory类,使用方法getManager()我只需要更改工厂类中的构造函数,允许对getManager()的所有引用仍然返回{ {1}},无需更改。

答案 2 :(得分:0)

抽象工厂设计模式是关于创建对象族,而不是单个对象。例如,GUI应用程序可以使用不同的具体工厂来绘制不同风格的元素。

答案 3 :(得分:0)

  

当看起来创建圆的创建逻辑与创建工厂的创建逻辑完全相同时。

你在那里抓住了很大一部分困惑。如果创建开始越来越多(参见KeyFactory),它可以简化您的代码和消费者的代码。

答案 4 :(得分:0)

工厂模式是根据提供给它的数据返回几个可能类之一的实例。它是一个"设计模式"。您甚至可以使用" polymorphism"来实现它。这种模式为"类似对象"。

的对象创建过程提供了一个包装器

工厂模式可用于 -

  1. 通过隐藏对象创建过程来降低客户端代码的复杂性
  2. 提供公共接口以公开新创建的对象。
  3. 当一个类无法预测它需要创建哪类对象时。
  4. 有关详细信息,请参阅http://dgmjava.blogspot.in/2011/11/factory-design-pattern.html