2014-02-06 85 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