2014-02-06 37 views
-1

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

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

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; 
    } 

} 
+1

看起来并不像一个单身,我... –

+2

如果使用辛格尔顿然后进行构造'private' –

回答

1

您的要求是有争议的。如果你想拥有一个单身人士,那么按照定义,你将拥有这个类的一个实例。如果你想有很多实例,那么它不能是单例。

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

如果要在调用其方法后返回相同的类实例,请考虑使用Builder模式(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

你说的是工厂模式:

public class MyClass() { 
} 

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

工厂方法可以包含在你的类,你并不需要一个单独的工厂类。

0

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

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

但对我来说并不起任何作用替换

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

实例。但你仍然可以这样做:)

+2

何苦这样做,不就叫'新GrigliaImpl();'因为他的构造是公开... – diazazar

+0

不小心张贴了一半的答案。再次编辑:) – Sanjeev