(根据收集的各个资料整理而得~)
一、单态模式的定义
Singleton模式要求一个类有且仅有一个实例,并且提供一个全局的访问点。
二、使用Singleton注意事项:
有时在某些情况下,使用Singleton并不能达到Singleton的目的,如有多个Singleton对象同时被不同的类装入器装载;在EJB(Enterprise Java Beans)这样的分布式系统中使用也要注意这种情况,因为EJB是跨服务器,跨JVM的
(我们以SUN公司的宠物店源码(Pet Store 1.3.1)的ServiceLocator为例稍微分析一下:
在Pet Store中ServiceLocator有两种,一个是EJB目录下;一个是WEB目录下,我们检查这两个ServiceLocator会发现内容差不多,都是提供EJB的查询定位服务,可是为什么要分开呢?仔细研究对这两种ServiceLocator才发现区别:在WEB中的ServiceLocator的采取Singleton模式,ServiceLocator属于资源定位,理所当然应该使用Singleton模式。但是在EJB中,Singleton模式已经失去作用,所以ServiceLocator才分成两种,一种面向WEB服务的,一种是面向EJB服务的。 )
三、使用单态模式的优点:
1.控制资源的使用,通过线程同步来控制资源的并发访问;
2.控制实例产生的数量,节省内存,有利于垃圾回收。
3.作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。
比 如,数据库连接池的设计一般采用单例模式,数据库连接是一种数据库资源。软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损 耗,这种效率上的损耗还是非常昂贵的。当然,使用数据库连接池还有很多其它的好处,可以屏蔽不同数据数据库之间的差异,实现系统对数据库的低度耦合,也可 以被多个系统同时使用,具有高可复用性,还能方便对数据库连接的管理等等。数据库连接池属于重量级资源,一个应用中只需要保留一份即可,既节省了资源又方 便管理。所以数据库连接池采用单例模式进行设计会是一个非常好的选择。
四、生活中的例子:
1.每台计算机可以有若干个打印机,如果每一个进程或者线程都独立地使用打印机资源的话,那么我们打印出来的结果就有可能既包含这个打印任务的一部分,又包含另外一个打印任务的一部分。所以,大多数的操作系统最终为打印任务设计了一个单例模式的假脱机服务Printer Spooler,所有的打印任务都需要通过假脱机服务进行。
2.在我们日常使用的在Windows中也有不少单例模式设计的组件,象常用的文件管理器。由于Windows操作系统是一个典型的多进程多线程系统,那么在创建或者删除某个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象。采用单例模式设计的文件管理器就可以完美的解决这个问题,所有的文件操作都必须通过唯一的实例进行,这样就不会产生混乱的现象。
五、2种实现:
实现原理:首先必须将类的构造方法的访问权限设为private,这样就不能用new操作符在类的外部产生该类的对象实例了。其次在类的内部产生一个静态的对象,再产生该类的静态方法返回内部创建的对象实例以便外部来访问这个唯一的对象实例。(外部要访问唯一对象,只有内部来创建,需定义一个方法来返回对象,而且必须是静态的,静态的方法只能访问静态变量,所以定义的对象变量也必须是静态的。)
1.第一种形式: public class Singleton {
private Singleton(){}
//注意这个实例是private的, 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
2.第二种形式: public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
使用Singleton.getInstance()可以访问单态类。
第二种形式是lazy initialization,也就是说第一次调用时初始Singleton,以后就不用再生成了。
注意到lazy initialization形式中的synchronized(线程同步),这个synchronized很重要,如果没有synchronized,那么使用getInstance()是有可能得到多个Singleton实例。在一个多线程的程序中,如果同步的消耗是很大的,很容易造成瓶颈。
一般认为第一种形式要更加安全些。
参考资料:http://www.blogjava.net/endisoft/archive/2006/09/27/72178.html
分享到:
相关推荐
创建型模式 1. 工厂方法模式(Factory Method Pattern) 工厂方法模式是一种创建型设计模式,它提供了一种创建对象的接口,允许客户端创建对象,而无需指定创建的类别。这个模式解决了工厂模式的缺点,提供了更多...
单态模式是一种创建型模式,它提供了一种方式来创建一个类的唯一实例,确保任何时候都只有一个实例存在。 1.1.5 原型模式(Prototype Pattern) 原型模式是一种创建型模式,它提供了一种方式来创建一个对象的副本...
单态模式(Singleton Pattern)是设计模式中的一种基础模式,主要用来确保一个类只有一个实例,并提供一个全局访问点。在软件工程中,当一个类只能有一个实例而且客户可以从一个众所周知的访问点访问它时,这样的...
单态模式(Singleton Pattern)是软件设计模式中的一种,它保证了类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如配置管理、线程池、缓存管理和日志记录等,因为它可以确保在整个系统中...
设计模式之 Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证一个类只有一个实例,并提供一个访问它的全局访问点 设计模式之 Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 new 一样频繁. ...
单态模式(Singleton Pattern)是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象,且只允许存在一个实例的情况下非常有用,例如配置管理、线程池、缓存...
单态模式(Singleton Pattern)和简单工厂模式(Simple Factory Pattern)是软件设计中常见的两种创建型设计模式。在Java编程中,它们都是为了简化对象的创建过程,但各自有着不同的应用场景和特点。 单态模式是一...
单态模式(Singleton Pattern)是一种常用的软件设计模式,它的核心目标是确保一个类在整个应用程序中只有一个实例,并提供全局唯一的访问点。这种模式在资源管理、配置管理、对象协调等方面有广泛应用,例如创建...
单态模式是一种创建型设计模式,其核心在于保证一个类只有一个实例,并提供一个全局访问点。这种模式的主要目的是为了节约系统资源,避免频繁地创建和销毁对象,同时提供了一个全局共享的入口,使得在系统中的任何...
简单工厂模式是一种创建型设计模式,它提供一个工厂类来创建对象,而不是让客户端直接实例化对象。这样可以隐藏对象创建的复杂性,并允许更换或扩展产品类而不修改使用它们的客户端代码。 4. 门面模式(Facade ...
单态模式(Singleton Pattern)是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在.NET环境中,无论是C#还是ASP.NET项目,单态模式都是经常被用到的设计模式之一,尤其在处理全局配置、...
单件模式(Singleton Pattern)是软件设计模式中最为常见的一种,它的主要目标是确保某个类只有一个实例,并提供一个全局访问点。单件模式在很多情况下都非常有用,比如管理共享资源(如内存、文件句柄等)、作为...
单态模式(Singleton Pattern)是设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这个模式通常用于控制资源的共享,比如数据库连接、线程池或者配置对象等。在Java或其他面向对象...
单态设计模式(Singleton Pattern)是一种常见的软件设计模式,它的目标是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处包括资源管理的有效性、性能优化以及简化多线程环境下的同步控制。在Java中,...
单态模式(Singleton Pattern)是设计模式中的一种,它的核心思想是限制类的实例化,确保一个类只有一个实例,并提供全局访问点。在.NET开发中,单态模式被广泛应用于那些需要频繁实例化然后销毁的对象,或者需要...
单态模式(Singleton Pattern)是设计模式中的一种,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。在MFC(Microsoft Foundation Classes)框架中,单态模式的应用同样重要,尤其对于需要全局共享的...
Java语言中的构造方法私有化是一种常见的编程技巧,主要用于实现特定的设计模式,如单态模式(Singleton Pattern)。在Java中,私有构造方法是通过将构造函数声明为private来实现的,这使得其他类无法直接实例化该类...
单态模式(Singleton Pattern)是软件设计模式中最基础且常用的一种模式,主要目的是控制类的实例化过程,确保一个类在整个应用程序中只有一个实例,并提供一个全局访问点。这个模式在Java编程中尤其常见,因为Java...
- 单态模式是一种设计模式,它的主要目标是确保一个类只有一个实例,并提供一个全局访问点。在Java中,通常通过以下两种方式实现单态模式: - **饿汉式(Eager Initialization)**:在类加载时就完成了初始化,...
在软件设计中,单态模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。PHP中的单态模式实现通常涉及将类的构造函数设置为私有(private)和静态...