Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 单件模式-首件设计模式书中的疑问_Oop_Singleton - Fatal编程技术网

Oop 单件模式-首件设计模式书中的疑问

Oop 单件模式-首件设计模式书中的疑问,oop,singleton,Oop,Singleton,在第175页,有一个巧克力锅炉类的例子。大概是这样的: public class ChocolateBoiler { private boolean empty; private boolean boiled; public ChocolateBoiler { empty = true; boiled = false; } // and then three methods to fill, drain and boil whic

在第175页,有一个巧克力锅炉类的例子。大概是这样的:

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实例,那么事情会如何发展?”


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

问题不在于创建对象的实例

这是关于对象的两个实例引起的混乱,这两个实例都声称具有巧克力锅炉的状态

如果某个对象(例如,炊具)认为它具有巧克力锅炉的状态,而另一个对象(例如,配方)认为它具有巧克力锅炉的状态,那么现在会发生什么


因为变量是实例变量,所以巧克力锅炉对象不会同意巧克力锅炉的状态。现在会发生什么呢?

如果只有一个巧克力锅,那么这只是一个问题,如果只有一个,那么应该是一个单身汉。

我相信在那个例子中,你只有一个巧克力锅。因此,您应该只能创建表示它的对象的一个实例。如果允许您创建多个实例,那么您可能会在系统中的某个地方发出命令
If(boiler.hotwough())boiler.stop()
,并会惊讶地发现,尽管锅炉已经太热了,但它并没有停止,因为您正在与锅炉的某个“死”实例对话,该实例返回
hotwough()
:错误


使用单例模式,您可以确保无论在代码中的何处使用Boiler.getInstance(),您都将得到唯一的Boiler对象,并且当您与它交谈时,它将按照您的预期进行操作。

单例中的巧克力锅炉的整个示例在我阅读时让我非常困扰

在一个非常基本的层面上,我不明白为什么当你只有一个物理的东西时,有必要在软件中强制执行这个事实。如果你得到另一个怎么办?你打算怎么做,把第二个添加到同一个单例中?做两个不同的单身汉?一个简单的全局变量就可以完成这项工作

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


也许我只是不明白重点。我以前没有在设计模式方面做过太多面向对象的工作,我也因此失去了工作机会,所以我正在阅读它

谢谢你们的回复。似乎我对这个问题的处理太过分了:)