我正在尝试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()如何/为什么会发生这种情况?
答案 0 :(得分:1)
有一种关系。 SodaImpSingleton
使用CherrySodaImp
进行实例化。接下来,MediumSoda extends Soda
并在其构造函数中调用方法setSodaImp()
,该方法在抽象SodaImpSingleton.getTheSodaImp();
类中实现为Soda
,这是一个返回{{1在第一行创建的实例。
答案 1 :(得分:1)
MediumSode.pourSoda()
调用Soda.this.getSodaImp()
,返回Soda.this.sodaImp
由MediumSoda()
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;
}
}
虽然这不是安全的。