Builder中的混乱以及来自fluffycat的示例中的Singleton模式

时间:2013-05-09 14:39:19

标签: java design-patterns

我正在尝试fluffycat

中的构建器示例
SodaImpSingleton sodaImpSingleton = new SodaImpSingleton(new CherrySodaImp());
System.out.println("testing medium soda on the cherry platform");
MediumSoda mediumSoda = new MediumSoda();
mediumSoda.pourSoda();

这里sodaImSingleton和mediumSuda之间没有关系, 仍然在调用mediumSoda.pourSoda()时会打印出来 CherrySodaImp.pourSodaImp()如何/为什么会发生这种情况?

2 个答案:

答案 0 :(得分:1)

有一种关系。 SodaImpSingleton使用CherrySodaImp进行实例化。接下来,MediumSoda extends Soda并在其构造函数中调用方法setSodaImp(),该方法在抽象SodaImpSingleton.getTheSodaImp();类中实现为Soda,这是一个返回{{1在第一行创建的实例。

答案 1 :(得分:1)

MediumSode.pourSoda()调用Soda.this.getSodaImp(),返回Soda.this.sodaImpMediumSoda() constuctor通过Soda.this.setSodaImp()设置为static SodaImpSingleton.getTheSodaImp()的{​​{1}}。 SodaImpSingleton.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;
    }
}

虽然这不是安全的。