【发布时间】:2012-10-31 06:56:54
【问题描述】:
我的问题有点长。 我正在学习抽象工厂模式。
我有一个抽象工厂的抽象类。 我想分享混凝土工厂所需的“资源”。 所以我只是将 AbstractFactory 中的变量设为静态
public class AbstractFactory{
private static Vector vector = new Vector();
protected Vector void getVector() {
return vector;
}
protected void setVector(Vector v){
this.vector = v;
}
public abstract Circle createCircle();
}
它的子类看起来像:
public class ConcreteFactory extends AbstractFactory{
public ConcreteFactory(){
super();
}
public Circle createCircle(){
Circle circle = new Circle();
getVector().add(circle);
return circle;
}
}
但是,我的老师说我不应该使用静态对象实例 因为静态变量经常用于一些常量。
因此,对于 Vector,我使用 instance variable instance 而不是 static variable ,当我实例化具体工厂时,我从外部传递向量。
所以我的课程的新设计将如下所示:
public class AbstractFactory{
private Vector vector;
protected Vector void getVector() {
return vector;
}
protected void setVector(Vector v){
this.vector = v;
}
public abstract Circle createCircle();
}
public class ConcreteFactory extends AbstractFactory{
public ConcreteFactory(Vector v){
super();
setVector(v);
}
public Circle createCircle(){
Circle circle = new Circle();
getVector().add(circle);
return circle;
}
}
**
我的问题是:为什么我不应该使用静态变量来共享对象?
**
在具体工厂之间共享资源将更容易,无需传入 Vector 当我创建一个具体工厂的实例时。
【问题讨论】:
-
你的向量的目的是什么?我还必须说,任何甚至提到 Vector 的课程都是高度可疑的。这个类已经过时了十多年了。
-
Vector 可能是缓存吗?在不同的工厂实现之间共享对象没有多大意义。特别是因为抽象工厂在实践中的意义在于让库的客户能够提供自己的工厂实现。
-
在原始版本的代码中,具体工厂创建的产品都需要在其构造函数中使用Vector,这意味着产品需要相同的向量,并且工厂应该具有相同的向量,这样他们可以使产品具有相同的向量。有没有更好的设计来解决这个问题?
-
每一个设计选择都以全图分析为准。如果不知道向量的确切作用,就不可能说什么是更好的设计。如果向量实际上是一个全局变量,那么将它放在静态变量中是有意义的。但是,我看不到一个现实的场景,即必须从所有这些产品对象中访问全局变量。通常它会隐藏在一个提供内部需要该变量的服务的 API 后面。
-
使用实例方法返回静态变量的值是您的提议的一个明确问题。如果类需要访问该共享资源,那么要么使用
public static final Vector,要么使用private static final Vector和public static Vector getVector()。如果子类可以覆盖它并提供不同的向量,那么您的方式仍然有意义,但这种设计必须有原因。
标签: java oop design-patterns