`

【编程思想】面向对象中的getInstance()与单例模式

阅读更多


今天看到这样的一段代码,觉得有必要说一下。




private PackageManager() {		
	}
	
	private static  PackageManager instance = new  PackageManager ();
	
	public static  PackageManager getInstance() {
		return instance;
	}


可以看到,构造函数是私有的,而唯一公开的供我们调用一个对象的接口不是构造函数,而是一个getInstance()函数,为什么不将构造函数设置为公有,直接new 一个对象呢,这样做有什么好处呢


这种构造对象的方式,我们一般称之为单例模式,单例模式,顾名思义,只允许一个对象存在,无论是什么时候,你构造和调用的对象都永远是那个实例。


单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。


很明显,单例模式阻止了大量对象的生成,节省了内存,最重要的一点还是,它适用于很多需要处理资源冲突的地方,比如,每台计算机可以有若干个打印机,但只能有一个Printer Spooler,避免两个打印作业同时输出到打印机。


单例模式的要点

      显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。所有的客户对象共享一个单例对象。单例对象持有对自己的引用。  

      一些资源管理器常常设计成单例模式。  

      在计算机系统中,需要管理的资源包括软件外部资源,每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情况。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。  

     需要管理的资源包括软件内部资源,譬如,大多数的软件都有一个(甚至多个)属性(properties)文件存放系统配置。这样的系统应当由一个对象来管理一个属性文件。        需要管理的软件内部资源也包括譬如负责记录网站来访人数的部件,记录软件系统内部事件、出错信息的部件,或是对系统的表现进行检查的部件等。这些部件都必须集中管理,不可政出多头。

  这些资源管理器构件必须只有一个实例,这是其一;它们必须自行初始化,这是其二;允许整个系统访问自己这是其三。因此,它们都满足单例模式的条件,是单例模式的应用。


当一个类的实例可以有且只可以一个的时候就需要用到了。为什么只需要有一个呢?有人说是为了节约内存。本人对这个说法持保留态度。只有一个实例确实减少内存占用,可是我认为这不是使用单例模式的理由。我认为使用单例模式的时机是当实例存在多个会引起程序逻辑错误的时候。比如类似有序的号码生成器这样的东西,怎么可以允许一个应用上存在多个呢?


C#中的单例模式

  用法说明:保证一个类仅有一个实例,并提供一个访问它的全局访问点

  实现要点Singleton模式是限制而不是改进类的创建;Singleton类中的实例构造器可以设置为Protected以允许子类派生;Singleton模式一般不要支持Icloneable接口,因为这可能导致多个对象实例,与Singleton模式的初衷违背;Singleton模式一般不要支持序列化,这也有可能导致多个对象实例,这也与Singleton模式的初衷违背;Singleton只考虑了对象创建的管理,没有考虑到销毁的管理,就支持垃圾回收的平台和对象的开销来讲,我们一般没必要对其销毁进行特殊的管理;理解和扩展Singleton模式的核心是“如何控制用户使用new对一个类的构造器的任意调用”;可以很简单的修改一个Singleton,使它有少数几个实例,这样做是允许的而且是有意义的。  

     优点

          实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从      而确保所有对象都访问唯一实例

          灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程

     缺点

           开销:虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将      仍然需要一些开销。可以通过使用静态初始化解决此问题,上面的五种实现方式中已经        说过了。  

           可能的开发混淆:使用 singleton 对象(尤其在类库中定义的对象)时,开发人员      必须记住自己不能使用 new 关键字实例化对象。因为可能无法访问库源代码,因此应        用程序开发人员可能会意外发现自己无法直接实例化此类。


     对象的生存期:Singleton 不能解决删除单个对象的问题。在提供内存管理的语言中        (例如基于 .NET Framework 的语言),只有 Singleton 类能够导致实例被取消分        配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对        象实例,但这样会导致 Singleton 类中出现悬浮引用。  


     适用性当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时;当这个      唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的        实例时。  

     

      应用场景:

       PC机中可能有几个串口,但只能有一个COM1口的实例;

          系统中只能有一个窗口管理器。


  实现要素:

  至少在目前所有了解的语言中,静态变量(这是c/c++的叫法,其他语言或有不同)是实现单例模式的要素。



    不过,对于这种单例模式,还是要注意适用范围,用的恰当,方能大有裨益,不恰当的话,反而会弄巧成拙。


分享到:
评论

相关推荐

    qt5编写的单例模式

    在面向对象编程中,单例模式限制类的实例化过程,使得整个系统只能有一个实例。这样做的好处包括减少内存开销、避免资源竞争以及提供统一的访问接口等。在Qt5中,我们可以利用其强大的信号与槽机制,结合C++的静态...

    单例模式单例模式单例模式

    - **增加系统复杂度**:单例模式破坏了面向对象编程中的一个基本原则——封装性,使得代码难以理解和维护。 - **并发问题**:在多线程环境中,单例模式可能会导致线程安全问题,需要额外处理同步机制。 #### 五、...

    大话设计模式--Singleton(单例模式)

    在Java、C#等面向对象编程语言中,单例模式有着广泛的实践。 单例模式的实现通常有以下几种方法: 1. 饿汉式(静态常量): 这种方式在类加载时就完成了实例化,线程安全。代码如下: ```java public class ...

    Java面向对象(高级)- 单例(Singleton)设计模式

    单例设计模式是面向对象编程中的一种常见设计模式,它的主要目的是确保一个类在整个程序运行期间只有一个实例,并提供全局访问点。这种模式在Java中被广泛应用,尤其是在需要控制资源的共享,如数据库连接池,线程池...

    单例模式的各个版本

    在Java、C#等面向对象编程语言中,单例模式被广泛应用,尤其在处理系统级资源如数据库连接池、缓存管理时。单例模式的主要目标是控制类的实例化过程,避免因多次实例化导致的资源浪费和状态冲突。 **线程安全的单例...

    C#单例模式视频讲解

    《C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式)》这个视频教程很可能深入浅出地介绍了单例模式的概念、实现方式以及在实际项目中的应用案例,对于学习和掌握单例模式是很好的参考资料。通过观看和实践...

    设计模式单例模式.zip

    在Java、C++、Python等面向对象编程语言中,单例模式有多种实现方式。在Java中,常见的单例模式实现包括懒汉式、饿汉式、双重检查锁定(DCL)以及枚举类型实现。 1. **懒汉式**:这种实现方式是在第一次调用时才...

    单例模式分析及代码

    在校园招聘中,面试官常通过询问单例模式来考察应聘者的面向对象设计能力、多线程理解和代码优化技巧。理解并熟练掌握单例模式的实现和应用场景,对于提升编程能力和解决实际问题具有重要意义。 总的来说,单例模式...

    第五讲单例模式

    在本讲“第五讲单例模式”中,我们将深入探讨这个模式的原理、实现方式以及其在实际编程中的应用。 单例模式的核心思想是确保一个类在整个系统运行期间只有一个实例,并提供一个全局访问点来获取这个唯一的实例。...

    javascript的oop思想以及单例,工厂,观察者模式简例

    以上就是JavaScript中的面向对象编程思想,以及单例模式、工厂模式和观察者模式的简单实现。理解并熟练运用这些设计模式,能帮助开发者编写出更加高效、可维护的代码。在实际项目中,根据需求灵活组合和应用这些模式...

    php面向对象值单例模式

    简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务; 单例类: 1、构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例...

    PHP单例模式详解及实例代码

    单例模式是一种常用的软件设计模式,在面向对象编程领域中被广泛使用。其核心思想是确保一个类仅有一个实例,并提供一个全局访问点。单例模式的应用范围非常广泛,特别是在需要全局配置和控制的场景中。本文将针对...

    利用ES6实现单例模式及其应用详解

    单例模式是一种设计模式,它的核心思想是保证一个类在整个应用程序中只有一个实例存在,并提供一个全局访问点。这种模式在JavaScript中尤其有用,因为它可以帮助管理全局状态,避免资源浪费,以及实现某些特定功能如...

    Delphi实现单例

    在Delphi这种面向对象的编程环境中,实现单例模式可以帮助开发者更好地管理资源,避免因多次实例化同一对象导致的问题,特别是在需要共享数据或服务的情况下。 在Delphi中实现单例,通常会利用类的静态成员和构造...

    C++和java设计模式之单例模式

    单例模式是一种常见的软件设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一的实例。这种模式在很多场景下非常有用,例如控制资源的共享、管理配置信息或者创建昂贵的对象等。在...

    java面向对象精华总结.doc

    - 面向对象是一种编程思想,它通过将数据和操作数据的方法封装在一起,实现了模块化的代码结构。这样可以将复杂问题拆解为更小、更易于管理的部分。 - 面向对象的核心概念包括封装、继承和多态。这些特性使得代码...

    Javascript实现单例模式

    在JavaScript中实现单例模式相对简单,但又有一些特殊性,因为它是一种基于原型的面向对象编程语言,没有类的概念,但可以通过函数、原型以及闭包等特性来实现类似类的行为。 单例模式的核心思想是通过构造函数和...

    php单态设计模式(单例模式)实例

    单态设计模式,又称单例模式,是一种常用的软件设计模式,尤其在PHP等面向对象编程语言中被广泛应用。它的核心思想在于确保一个类在整个应用程序生命周期内只有一个实例存在。这种模式常用于管理共享资源,比如...

Global site tag (gtag.js) - Google Analytics