不使用单例模式有什么问题

phi*_*o37 4 java singleton design-patterns

我正在阅读我的电子书(Head First Design Patterns)中关于单例模式的内容,我知道在您只需要某个类的一个实例的情况下,使用这种模式是合适的。
但是我对这本电子书中的问题介绍有点麻烦。
(是的,我想我可以在这里引用其中的一部分!?)

巧克力工厂
众所周知,所有现代巧克力工厂都有计算机控制的巧克力锅炉。锅炉的工作是吸收巧克力和牛奶,将它们煮沸,然后将它们传递到制作巧克力棒的下一阶段。
这是 Choc-O-Holic, Inc. 工业强度巧克力锅炉的控制器类。查看代码;你会注意到他们已经非常小心地确保不会发生不好的事情,比如排空 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

是的,这是他们的问题:

Choc-O-Holic 在确保不发生坏事方面做得不错,你不觉得吗?再说一次,您可能怀疑如果两个 ChocolateBoiler 实例松动,可能会发生一些非常糟糕的事情。
如果在一个应用程序中创建了多个 ChocolateBoiler 实例,事情会如何出错?

所以,当我们这样做时,问题就会“发生”:

ChocolateBoiler boiler1 = new ChocolateBoiler(),
 boiler2 = new ChocolateBoiler();
//...
Run Code Online (Sandbox Code Playgroud)

但是我看到这两个实例控制自己的行为,并且它们独立运行(因为这里没有静态字段)。
所以它们分开运行,对其他的没有影响。
我想知道这个问题是关于非法状态或者当一个实例运行并影响其他实例时可能发生的事情(“不正确的程序行为,过度使用资源或不一致的结果”,来自电子书),但它不在这里

所以How might things go wrong here?,是它只是浪费实例?

如果两个 ChocolateBoiler 实例松动,可能会发生一些非常糟糕的事情。

我想看看这bad things是怎么发生的?

#Edit 1: 感谢大家帮助我。我弄清楚我的问题是什么,
当我打电话时boiler2 = new ChocolateBoiler(),该boiler2实例仍然引用与bolder1相同的boiler,是吗?
第一次觉得new ChocolateBoiler()跟买新锅炉差不多 :)
这个是关于概念的,我是这里的菜鸟

Dra*_*vic 5

您似乎不理解此示例试图解释的概念。ChocolateBoiler不是真正的锅炉,它是一个 Java 类。

但是,此类可用于指示硬件(真正的锅炉控制器)执行某些操作。如果你错误地有两个实例,ChocolateBoiler并且错误地使用它们来指示同一个锅炉控制器,那么显然你有麻烦了。

在我的上一段中有两个“错误”,您可能会争辩说,如果您通常“错误地”做事,那么无论如何您都会遇到麻烦。但是在设计糟糕的单例的情况下,错误可能不会那么明显。如果您序列化和反序列化一个不处理序列化问题以保持唯一性的单例,然后尝试使用该实例来加热锅炉,您可能会烧毁锅炉。