返回自己的Java类

时间:2014-02-06 11:54:06

标签: java design-patterns

我需要一个能够返回自身实例的类。我喜欢单例模式使用的方法,它只返回一次类的实例。但我需要它返回多个实例。

这是我的单身人士模式。如何修改它以使其能够返回多个实例?

public class GrigliaImpl implements Griglia{

    private  static GrigliaImpl istanza;
    private JTextField[][] griglia;   
    private Color color;

    public  GrigliaImpl(){

    }


    @Override
    public int getColumn() {
        return griglia[0].length;
    }

    public JTextField[][] getMatrice(){

        return this.griglia;
        }

    @Override
    public int getRow() {
        return griglia.length;
    }


    @Override
    public void setColor(Color x) {
        this.color=x;

    }

    @Override
    public Color getColor() {
        return color;
    }

    public void set(int row,int column){
    this.griglia= new JTextField[row][column];
    }

    public static GrigliaImpl getIstanza(){
    if(istanza == null){
        istanza = new GrigliaImpl();
    }
    return istanza;
    }

}

3 个答案:

答案 0 :(得分:2)

您在谈论工厂模式:

public class MyClass() {
}

public class MyClassFactory() {
    public static getNewInstance() {
        return new MyClass();
    }
}

工厂方法可以包含在您的班级中,您不需要单独的工厂类。

答案 1 :(得分:1)

您的要求存在争议。如果你想拥有一个单例 - 那么根据定义你将拥有这个类的一个实例。如果你想拥有很多实例,那么它就不能是单例。

要创建单例,您需要将构造函数设为私有,并添加静态方法以获取类的实例,该实例将保留为静态字段。 (http://en.wikipedia.org/wiki/Singleton_pattern

如果要在调用其方法后返回相同的类实例,请考虑使用构建器模式(http://java.dzone.com/articles/dive-builder-pattern)。

public class GrigliaImpl implements Griglia {

private static GrigliaImpl instance;

private GrigliaImpl() {
}

public static GrigliaImpl getInstance() {
if (instance == null) {
instance = GrigliaImpl();
}
return instance;
}

public GrigliaImpl doSomething() {
// do something
return this;
}

}

答案 2 :(得分:0)

具有公共构造函数的每个类的默认行为是使用new运算符创建并返回该类的新实例。但是如果你特别希望实例通过getInstanceMethod而不是make constructor private和

替换

   public static GrigliaImpl getIstanza(){
      if(istanza == null){
        istanza = new GrigliaImpl();
      }
       return istanza;
     }

   public static GrigliaImpl getIstanza(){
        return new GrigliaImpl();
    }

但对我来说,没有任何目的。但你仍然可以这样做:)