更正设计模式以在运行时更改数据类型的实例

时间:2014-02-24 22:38:08

标签: java design-patterns factory

我一直在考虑使用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的实例需要在整个执行过程中持续存在,因为它是我的进化算法中的一个对象,不能被破坏并重新实例化为其他东西。

2 个答案:

答案 0 :(得分:1)

如果您解释为什么要这样做,它可能会有所帮助。根据您目前所说的内容,您最好的选择就是始终将类型用作Number,然后存储您需要的任何版本。例如number.toIntnumber.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);
}

}