Singleton模式 - Head Head Design Patterns中的疑问

时间:2009-05-24 11:17:04

标签: oop singleton

在第175页,有一个Chocolate Boiler类的例子。像这样:

public class ChocolateBoiler {  

  private boolean empty;  
  private boolean boiled;  

  public ChocolateBoiler {  
    empty = true;  
    boiled = false;  
  }  
 // and then three methods to fill, drain and boil which changes the  
 // status of these two flag depending of situation
}  

在“脑力”部分,他们会问一个问题“如果在应用程序中创建了多个ChocolateBoiler实例,那么问题怎么会出错?”

我不确定这门课有什么问题。为什么我们在这里引入单例模式?这两个标志不是静态的,因此每个实例都有一个。那么如何创建多个实例会让事情搞糟?

4 个答案:

答案 0 :(得分:2)

问题不在于制作一个对象的实例。

这是由于有两个对象实例造成的混乱,两者都声称具有ChocolateBoiler的状态。

如果某个Object(例如,Cooker)认为它具有ChocolateBoiler的状态,以及其他一些Object(例如,Recipe)的东西,它具有ChocolateBoiler的状态,那么现在会发生什么?

由于变量实例变量,因此ChocolateBoiler对象将不同意ChocolateBoiler的状态。现在发生了什么?

答案 1 :(得分:2)

这只是一个问题,如果只有一个ChocolateBoiler,如果只有一个,它应该是一个单身。

答案 2 :(得分:1)

我相信那个例子你只有一个巧克力锅。因此,您应该只能创建表示它的对象的一个​​实例。如果您被允许创建多个实例,那么您可能会在系统中的某个位置发出命令if (boiler.hotEnough()) boiler.stop(),并且会感到惊讶的是,尽管锅炉已经过热,但它并没有停止,因为您正在与一些'死'锅炉的实例,返回hotEnough():false。

使用单例模式,您确保无论您在代码中的何处使用Boiler.getInstance(),您都将获得唯一的锅炉对象,然后当您与之交谈时,它将以你会期待的。

答案 3 :(得分:1)

在我阅读时,单身人士中巧克力锅的整个例子给我带来了很多困扰。

在一个非常基础的层面上,我不明白为什么在你只有一件物质的东西时必须在软件中强制执行这个事实。如果你得到另一个会怎么样?你要做什么,把第二个添加到同一个单身人士?制作2个不同的单身人士?一个简单的全局变量可以完成这项工作。

IMO,它不是锅炉本身,你只能有一件事,它访问到特定锅炉的控件。你不能允许第二个人开始制作一批新的巧克力,而它已经在其他人的那个过程中,或者甚至允许同一个人在第一个完成之前制作第二批。从这个角度来看,一个简单的排队或批处理系统可以完成这项工作。使用书中的另一种模式,命令模式将是一种更好的处理方式,因为只有一个女服务员,并且所有新订单排队,直到厨师完成当前的食品订单。 (呃,如果你还没有看过这本书,我刚才说的话可能没什么意义,对不起)

也许我只是不明白这一点。我之前没有做太多OOP或任何有设计模式的事情,而且我因此失去了工作机会,所以我正在阅读它。