gpt4 book ai didi

java - 静态工厂 : Java Design Issue

转载 作者:搜寻专家 更新时间:2023-11-01 01:52:25 25 4
gpt4 key购买 nike

我有一个定义了一些通用功能的 Base 接口(interface)。现在这个基接口(interface)可以由 50 多个类实现,每个类都有一些不同的附加方法。我想要一个静态工厂,它将根据传递给该静态工厂方法的参数返回 50 个类中任何一个类的实例。

public interface Base {
public void a();
public void b();
}

public class myclass implements Base {
// a and b implementation

public String c() {
}
public String d() {
}
}

public class secondclass implements Base {
// a and b implementation

public String e() {
}
public String f() {
}
}

如何实现静态工厂方法。我不确定返回类型

  public synchronized static {return type} getInstance(String arg0) {
// do something and return any one class based on arg0
}

编辑:一个场景

如果传递的参数是300我想返回类 myclass

的对象

如果参数是900我想返回类 secondclass

的对象

等等。有这么多条件是行不通的。

不要做

public synchronized static {return type} getInstance(String arg0) {
// do something and return any one class based on arg0
if(arg0.equals("300")) {
return new myclass();

}

}

原因:这将无法销售。我正在开发一个公共(public) API,类列表可能会增加到 100 个或 500 个。我希望我的问题现在更清楚了。

更新:这里突出了非常有用的点,这就是我的想法

public abstract class Base {

public abstract void a();
public abstract void b();

public synchronized staticabstract Base getInstance(String arg0);

}


public class myclass extends Base {

private myclass() {} // private constructor not publicly instantiate
// a and b implementation

public void c();
public void d();

@Override
public synchronized static abstract Base getInstance(String arg0) {
if(arg0.equalsIgnoreCase("300")) { // only 1 if condition
return new myclass();
}
}
}



public class secondclass extends Base {

private secondclass() {} // private constructor not publicly instantiate
// a and b implementation

public void e();
public void f();

@Override
public synchronized static abstract Base getInstance(String arg0) {
if(arg0.equalsIgnoreCase("900")) { // only 1 if condition
return new secondclass();
}
}
}



Client side:
one applicaiton
Base b=Base.getInstance(300);
if(b instanceof myclass) {

}

second application

Base b=Base.getInstance(900);
if(b instanceof secondclass) {

}

最佳答案

更好的方法是生成静态方法:

static <T extends Base> T create(Class<T> type){
// create concrete instance of type T and return it
}

所以现在 create方法由实际具体类型参数化 Class目的。您可以使用 type通过反射或使用嵌套 if 创建适当的子类型声明。

使用泛型的好处是可以免费为您提供强大的类型安全性,这样您就可以避免未经检查的类型转换,下类后回家时无后顾之忧。

编辑:例如,如果您在每个子类中都有一个无参数构造函数,您可以将上面的代码实现为:

return type.newInstance();

编辑 2:总结讨论,如果工厂不能采用类型或创建对象的逻辑以非平凡的方式依赖于参数的值,则唯一选项如下:

static Base create(String someParameter){
// create the concrete class and return it
}

客户端代码如下所示:

Base b = create("myArgument");
if(b instanceof SomeDerived){
SomeDerived d = (SomeDerived) b;
// use d
} else if(b instanceof OtherDerived){
// you get the idea
}

不理想,但没有办法泛化 create没有 Class<? extends Base> 实例的方法.

关于java - 静态工厂 : Java Design Issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22821258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com