2013-05-09 152 views
1

例如,在生成器加Singleton模式我是從fluffycat混亂從fluffycat

SodaImpSingleton sodaImpSingleton = new SodaImpSingleton(new CherrySodaImp()); 
System.out.println("testing medium soda on the cherry platform"); 
MediumSoda mediumSoda = new MediumSoda(); 
mediumSoda.pourSoda(); 

這裏tryingout建設者的例子有sodaImSingleton和mediumSuda, 沒有關係仍時mediumSoda.pourSoda()被調用它打印 CherrySodaImp.pourSodaImp()這是怎麼發生的?

+1

我建議調試情況,然後跳入'pourSoda();'看看底下發生了什麼。需要查看更多代碼以確定發生了什麼。 – 2013-05-09 14:44:19

回答

1

有一種關係。 SodaImpSingleton實例化爲CherrySodaImp。接下來,MediumSoda extends Soda及其構造函數調用方法setSodaImp(),該方法在抽象Soda類中實現爲SodaImpSingleton.getTheSodaImp();,該類是返回在第一行創建的CherrySodaImp實例的靜態方法。

+0

public void setSodaImp(){ this.sodaImp = SodaImpSingleton.getTheSodaImp(); } – 2013-05-09 17:38:04

+0

@AchaBhoot Precisely – matsev 2013-05-09 22:03:19

1

MediumSode.pourSoda()調用Soda.this.getSodaImp()返回由MediumSoda() constuctor通過Soda.this.setSodaImp()設置爲static SodaImpSingleton.getTheSodaImp()Soda.this.sodaImpSodaImpSingleton.getTheSodaImp()返回的值全局調用new SodaImpSingleton(new CherrySodaImp())

這個例子非常複雜,我認爲它是無效的。

正確的最小單的實現是:

public class Singleton { 
    private static Singleton instance; 

    private Singleton() { 
    } 

    public static Singleton instance() { 
     if(instance == null) { 
      instance = new Singleton(); 
     } 
     return instance; 
    } 
} 

雖然它不是THEAD安全。