Java factory类相对于其他多态性的优势
我试图弄清楚Java中工厂类的用途。无论我看到哪里,它都说目的是Java factory类相对于其他多态性的优势,java,polymorphism,factory,Java,Polymorphism,Factory,我试图弄清楚Java中工厂类的用途。无论我看到哪里,它都说目的是 在不向客户端公开创建逻辑的情况下创建对象 使用公共接口引用新创建的对象的步骤 示例显示了一个接口,例如 public interface Shape { void draw(); } 一些具体的类实现了这个接口,例如 public class Circle implements Shape { @Override public void draw() { // Draw circle } }
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();
在我看来,这就像工厂一样实现了公共接口。我不太清楚“隐藏创建逻辑”的好处是什么,因为创建圆的创建逻辑似乎与创建工厂的创建逻辑完全相同。使用工厂的主要好处是,它们提供了一种抽象形式,甚至超过了典型继承所能提供的抽象形式。例如: 工厂如何生产该物品? 它是否分配了一个新对象?它是否访问池以节省资源?使用工厂时,可能从未使用过“new”关键字,从而节省内存和/或GC开销。工厂可以执行构造函数通常不应该执行的操作,例如进行远程过程调用或访问数据库。有时,工厂将返回一个未来的实例,这意味着它可以在并行线程中进行实际处理 工厂来自哪里? 工厂是你自己建的吗?从库导入工厂?它是通过某种形式的国际奥委会注入的吗
总之,工厂之所以被使用,是因为它们几乎是生产某些东西的抽象的最终形式。是的,他们给你的例子真的很糟糕。工厂模式与多态性关系不大,更多的是与最小化“
new
”关键字的使用有关
假设我构建了一个名为Manager
的类。当我构建它时,它接受一个字符串
和一个int
,因为它所管理的是一个Person
对象,带有名称和年龄
但是,当我开发应用程序时,我最终希望对新类型的数据进行操作,比如为我的个人添加一个职业字段。我希望我的经理能够在构造函数中使用枚举
,以及字符串
和int
一年后,我的应用程序有了很大的发展,我有了人的子类、数据访问对象,以及我需要传递给经理的各种数据。如果我没有使用工厂,那么在我实例化Manager
类的代码中的任何地方,我都必须修复构造函数
如果我使用了
ManagerFactory
类,并且使用了getManager()
方法,我只需要在我的工厂类中更改构造函数,允许对getManager()
的所有引用仍然返回管理器
,无需更改。抽象工厂设计模式是关于创建对象族,而不是单个对象。例如,GUI应用程序可以使用不同的混凝土工厂绘制不同样式的元素
似乎创建一个圆的创建逻辑与创建一个工厂的创建逻辑完全相同
你已经抓住了你困惑的大部分。在创建开始变得更加复杂的情况下(请参阅),它可以简化您的代码和用户的代码。工厂模式是根据提供给它的数据返回多个可能类之一的实例的模式。它是一种“设计模式”。您甚至可以通过使用“多态性”来实现它。该模式为“相似对象”的对象创建过程提供了一个包装器 工厂模式可用于-
有关详细信息,请参见难道您不能编辑Manager类的构造函数来处理这些新信息吗?例如,添加一个同时接受旧参数和新参数的新构造函数。可以,但为什么要这样做?这非常简单,易于扩展,并且组织得足够好,让您的代码新手能够清楚地阅读。为什么不应该在常规构造函数中执行这些类型的操作?让构造函数花费那么多时间被认为是糟糕的编程实践。构造函数基本上应该是即时的,因为您别无选择,只能阻止调用线程,直到它完成。同样,对于控制反转来说,有些事情对于构造函数来说根本不可能做到。例如,如果调用“new A”,则不可能从池中签出A的实例new“literally”表示“为此分配一个新实例”,而不能表示“从池中获取一个未使用的现有实例”。由于反转控制意味着创建对象的机制在代码中的其他地方或在配置中确定,因此构造函数不可能使用反转控制,因为反转控制意味着创建对象的机制在工厂中不存在相同的问题吗?或者人们不在乎工厂是否需要很长时间吗?1)工厂可以返回未来的实例,这意味着它可以处理结果,而调用线程在这段时间内继续执行其他操作。2) 工厂可以利用额外的并行线程进行处理器密集型活动。3) 可以证明,工厂需要时间,用户会接受这一点,而这对于建造师来说是不寻常的。4) 记住另一个与时间无关的原因(国际奥委会已经成为一件大事)