Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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
Design patterns 单例模式_Design Patterns_Singleton - Fatal编程技术网

Design patterns 单例模式

Design patterns 单例模式,design-patterns,singleton,Design Patterns,Singleton,我们什么时候应该使用单例模式以及为什么?理论上:当您需要将对象的实例化限制为一个实例时。实际上:决不。如果在整个系统中只需要一个对象来协调操作,则可以使用此模式。Facade就是一个很好的例子,也就是说,Facade可以作为单例实现,因为整个系统通常需要一个Facade对象 但一般来说,这通常是一种不好的做法,应该避免,一个主要原因是它极大地抑制了可扩展性。 为什么单身汉如此有吸引力?我会第一个承认:我也喜欢它。不,我喜欢单身汉。从我看到它的那一刻起,它就像一个老朋友。它简单而美丽 我会告诉你原

我们什么时候应该使用单例模式以及为什么?

理论上:当您需要将对象的实例化限制为一个实例时。实际上:决不。

如果在整个系统中只需要一个对象来协调操作,则可以使用此模式。Facade就是一个很好的例子,也就是说,Facade可以作为单例实现,因为整个系统通常需要一个Facade对象

但一般来说,这通常是一种不好的做法,应该避免,一个主要原因是它极大地抑制了可扩展性。

为什么单身汉如此有吸引力?我会第一个承认:我也喜欢它。不,我喜欢单身汉。从我看到它的那一刻起,它就像一个老朋友。它简单而美丽

我会告诉你原因:这是因为单例模式是非面向对象编程的倒退。对于那些“四人帮”一个字也不懂的人来说,这是一条生命线。我不知道它最初是如何进入那里的——毫无疑问是一些政治压力——但它不属于那里。这是邪恶的

这是“简短”的总结

a)这些问题我连十分之一都没有涉及。但我会列举一些

b)一个是内存管理;如果一段时间内没有人使用它,那么单例基本上只是一个内存泄漏。但是你不知道什么时候该放弃它,因为没有人会打电话给你说“暂时没有人会利用你!”

此外,你也不知道是谁一直在引用你的Singleton实例,因为你对分发它很不感兴趣,不是吗?(注意:Java的弱引用可以帮助解决这个问题)

c)说到内存泄漏,如果您的单例具有某个有限资源的句柄,如数据库或文件句柄,该怎么办?我想你得把那个混蛋关起来直到你的节目结束。谢天谢地,C++程序在崩溃前的时间不会超过10分钟,通常是因为资源耗尽或试图访问被释放的单身者。 d)另一个问题是单例设计在语法上有噪音;大多数语言都不支持它(很遗憾,Ruby支持它,但这可能是Matz知道得更好之前的事情),因此您不仅要在Singleton中使用样板代码,还要在每个使用它的人中使用样板代码

e)然后是子类化。几乎不可能将一个单例子类化,如果您管理它,那么首先就不应该使用单例。你甚至不想去那里。我走过了我不敢重述的道路。只要假装你做不到,你就会省下惊人的痛苦

f)静态方法像花岗岩一样灵活。每次你使用一个,你就是在用混凝土浇铸你程序的一部分。在你看着它变硬的时候,确保你的脚没有卡在里面。总有一天你会惊奇地发现,天哪,你真的需要另一个dang PrintSpooler类的实现,它应该是一个接口、一个工厂和一组实现类。哦

别以为就这些。还有许多其他问题。例如,尝试在中添加多线程,看看会发生什么。好吧,我来告诉你会发生什么:有一半的时候,你会得到一个Doubleton或Tripleton,除非你是一个同步专家,拥有一个Tripleton就像让三个Balrog出现在你的茶话会上一样令人向往。即使你是一名同步专家,并且掌握了双重检查的习惯用法,你仍然有一个Balrog需要处理,而且它们不是野餐

但这些问题与大问题相比都变得无关紧要,这就是单例“模式”鼓励你忘记你所知道的关于OO设计的一切,因为OO很难,过程也很容易


当您希望一组不同的对象能够引用单个对象时。也许他们都想使用相同的物理引擎或其他东西。。。当不同的物体生活在同一个世界时,你不希望它们有不同的物理模型

当您只需要类中的一个实例时。最好的例子之一是记录器。您只需要它的一个实例。

当系统中只需要一个类的一个实例时。因为它只有一个实例,所以您可以严格地决定用户如何访问它。

正如所说,单例模式的目的是确保实例化一个类的单个实例

单例模式被认为是中的“坏”模式之一,因为单例会导致代码中的耦合,并使代码的(单元)测试变得困难。后一点在(大多数)动态/松散类型语言中不是100%正确的,因为您可以对补丁代码进行monkey操作

让我们看看耦合:每个使用单例的代码段都直接耦合到单例的实现。这是很难/不可能模拟的,因为单例通常用于数据库访问层之类的基础设施服务,所以要测试的单元与数据库访问层的具体实现相耦合。但是对于单元测试,您不希望访问数据库,您希望有一些模拟数据访问层。最后你会问自己为什么要使用单例模式


我建议单例模式仅适用于“简单”软件,但众所周知,软件有增长的趋势。几年后开始简单,结束复杂。

当您不想创建同一类型的多个实例时,您需要选择singleton。但是,如果使用静态类,也可以实现同样的效果。这里的要点是,它不是唯一的一个实例,而是对实例创建的控制,从而避免了unnecc
class Singleton {

      private static Singleton instance;

      private Singleton(){
      }

      public static Singleton getInstance(){
         if(instance=null){
            instance=new Singleton();
         }

         return instance;
      }
      ........
    }