我一直在考虑使用generic factory pattern,但我只是想确保我正确使用它。
首先,由于客户需要,这必须是基于Java的。
我的应用程序可以实例化多个对象,并且每个对象都应该能够在运行时更改类型。例如,变量可以以float形式开始,转换为int,然后转换为char,然后返回float。这将是一个基本的例子,但是可以添加自定义数据类型以获得额外的乐趣。
在这种情况下,通用工厂模式是正确的吗?或者,还有更好的东西吗?对我来说,工厂模式似乎更好地实例化而不是更新(除非我基本上销毁并重新实例化变量)。
更多细节:
这是一种进化算法,我不一定知道程序启动时的类型。根据进化的方式,它可能会发现int比浮点数更令人满意。
例如,如果我以浮点值4.34开始:
// start of program
object var = 4.34;
// evolution running......
...
// evolution determines that var would be better as a float
var.convertToInt();
// var is now an int with a value of 4
我最初的想法是拥有一个通用的工厂类型对象,我跟踪对象的当前“类型”并返回适当的值。所以在开始时它将返回float
,并且在转换之后将返回int转换后的值(映射到内部int
)。
编辑2:代码澄清。
我想我的意思是没有通过。这是一个我希望看到的代码示例。
object var = new object(int, 4); // create int variable with value of 4
// where object is whatever base design pattern i am using here
...
var.toFloat(); // convert var to float, value is now 4.0
System.out.println(var.getValue()); // prints 4.0
...
var.toCustomClass(); // var is now a custom datatype
System.out.println(var.getValue()); // calls the print method of the class
我还应该提到var
的实例需要在整个执行过程中持续存在,因为它是我的进化算法中的一个对象,不能被破坏并重新实例化为其他东西。
答案 0 :(得分:1)
如果您解释为什么要这样做,它可能会有所帮助。根据您目前所说的内容,您最好的选择就是始终将类型用作Number,然后存储您需要的任何版本。例如number.toInt
,number.toDouble
等
对于更复杂的类型,定义一个通用接口,它们都使用该接口实现和存储它们,然后编写适当的映射方法或使用Dozer等库为您进行映射。
您将需要创建自己的类来处理此问题。例如:
public class Value {
Object value;
Object getValue();
void toInteger() {
if (value instanceof Number) {
value = Integer.valueOf(((Number)value).intValue());
} else {
// Handle the conversion however you handle it
}
}
}
答案 1 :(得分:0)
也许这会有所帮助。
通过提供泛型方法,返回类型被转换为变量的类型以保存结果。如果类型不兼容,将启动ClassCastException
public class Wrapper {
private Object src;
public Wrapper(Object o) {
src = o;
}
public String getType(){
return src.getClass().getName();
}
public <E> E getValue() {
return (E)src;
}
public void toInteger(){
//dummy implementation
if(src instanceof Double){
src=new Integer(String.valueOf((int)Math.floor((Double)src)));
}
}
public static void main(String args[]){
Wrapper wrapper=new Wrapper(new Double(4.8));
System.out.println(wrapper.getType());
Double myDouble=wrapper.getValue();
System.out.println(myDouble);
wrapper.toInteger();
System.out.println(wrapper.getType());
Integer myInteger=wrapper.getValue();
// Double exceptionInProgress = wrapper.getValue();
System.out.println(myInteger);
}
}