我正在阅读电子书《Head First 设计模式》中的单例模式,我知道使用该模式适用于仅需要某个类的一个实例的情况。
但是我对这本电子书中的问题介绍有些困惑。
(是的,我想我可以在这里引用它的一部分!)
巧克力工厂
每个现代化的巧克力工厂都拥有计算机控制的巧克力锅炉。锅炉的工作是将巧克力和牛奶加热至沸腾,然后将它们传输到制作巧克力棒的下一个阶段。
这是 Choc-O-Holic 公司工业强度的巧克力锅炉的控制器类。看看代码;你会注意到他们试图非常小心地确保不会发生坏事,比如排出 500 加仑未煮沸的混合物,或者在锅炉已满时灌满锅炉,或者将空锅炉煮沸!
public class ChocolateBoiler {
private boolean empty;
private boolean boiled;
private ChocolateBoiler() {
empty = true;
boiled = false;
}
public void fill() {
if (isEmpty()) {
empty = false;
boiled = false;
// fi ll the boiler with a milk/chocolate mixture
}
}
public void drain() {
if (!isEmpty() && isBoiled()) {
// drain the boiled milk and chocolate
empty = true;
}
}
public void boil() {
if (!isEmpty() && !isBoiled()) {
// bring the contents to a boil
boiled = true;
}
}
public boolean isEmpty() {
return empty;
}
public boolean isBoiled() {
return boiled;
}
}
是的,这是他们的问题:
Choc-O-Holic已经做了相当不错的工作,确保不会发生坏事,你不这么认为吗?但如果两个ChocolateBoiler实例失控,那么你可能会怀疑会发生很糟糕的事情。
如果在应用程序中创建多个ChocolateBoiler实例,可能会出现什么问题?
因此,当我们这样做时,问题就会“发生”:
ChocolateBoiler boiler1 = new ChocolateBoiler(),
boiler2 = new ChocolateBoiler();
//...
但我发现这两个实例控制它自己的行为,并且它们独立运行(因为这里没有静态字段)。因此,它们分别运行而不会影响其他实例。我想知道这个问题是关于非法状态或者当一个实例运行并影响到其他实例时可能发生的情况(来自电子书的“错误程序行为、过度使用资源或不一致的结果”),但这并不是这里的情况。
那么,“事情怎么会出错呢?”,难道只是浪费实例吗?
引用:“如果有两个ChocolateBoiler实例失控,那么会发生一些非常糟糕的事情。”
我想看看那些“糟糕的事情”会如何发生?
#编辑1: 感谢大家帮助我。我解决了我的问题。 当我调用“boiler2 = new ChocolateBoiler()”时,“boiler2”实例仍然指向与“bolder1”相同的锅炉,对吗? 第一次我认为“new ChocolateBoiler()”类似于购买一个新锅炉:) 这是关于概念,我是一个新手。