首页 > 编程语言 > 详细

Java 设计模式(三)-单例模式(Singleton Pattern)

时间:2017-04-09 09:32:19      阅读:257      评论:0      收藏:0      [点我收藏+]

 

1     概念定义

1.1   定义

确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

1.2   类型

创建类模式

1.3   难点

1)多个虚拟机

当系统中的单例类被拷贝运行在多个虚拟机下的时候,在每一个虚拟机下都可以创建一 个实例对象。在使用了 EJBJINIRMI 技术的分布式系统中,由于中间件屏蔽掉了分布式 系统在物理上的差异,所以对你来说,想知道具体哪个虚拟机下运行着哪个单例对象是很困 难的。 因此,在使用以上分布技术的系统中,应该避免使用存在状态的单例模式,因为一个有 状态的单例类,在不同虚拟机上,各个单例对象保存的状态很可能是不一样的,问题也就随 之产生。而且在 EJB 中不要使用单例模式来控制访问资源,因为这是由 EJB 容器来负责的。 在其它的分布式系统中,当每一个虚拟机中的资源是不同的时候,可以考虑使用单例模式来 进行管理。

2)多个类加载器

当存在多个类加载器加载类的时候,即使它们加载的是相同包名,相同类名甚至每个字 节都完全相同的类,也会被区别对待的。因为不同的类加载器会使用不同的命名空间 namespace)来区分同一个类。因此,单例类在多加载器的环境下会产生多个单例对象。

3)错误的同步处理

在使用上面介绍的懒汉式单例模式时,同步处理的恰当与否也是至关重要的。不然可能 会达不到得到单个对象的效果,还可能引发死锁等错误。因此在使用懒汉式单例模式时一定 要对同步有所了解。不过使用饿汉式单例模式就可以避免这个问题。

2     原理特征

2.1   类图

 

技术分享

2.2   优点

1)内存中只存在一个实例,节省空间

2)避免频繁创建销毁,减少系统性能开销

3)可避免对资源的多重占用,如:写时避免重复写

4)可在系统设置全局的访问点,如:可用单例类来负责所有数据表的映射

2.3   缺点

1)单列模式无接口,不可拓展

2)并行开发环境中,单例模式未完成时,无法进行单元测试,也不能用mock的方式虚拟一个对象

3)单例模式与单一职责原则冲突。

3     .应用拓展

3.1   应用场景

1)要求生成唯一序列号的环境。

2)需要定义大量静态常量和静态方法的环境,如:工具类。

3)创建的对象消耗的资源过多时,如:访问I/O或数据库等资源。

4)项目中需要全局共享访问点或共享数据时,

5)需要频繁实例化然后销毁的对象。

3.2   实践拓展

1)饿汉模式

https://github.com/Devonmusa/java-demos/blob/master/src/main/java/com/designpattern/singleton/HungrySingleton.java

2)懒汉模式

https://github.com/Devonmusa/java-demos/blob/master/src/main/java/com/designpattern/singleton/LazySingleton.java

3)  注册模式

https://github.com/Devonmusa/java-demos/blob/master/src/main/java/com/designpattern/singleton/RegisterSingleton.java

4     注意事项

1).只能使用单例类提供的方法得到单例对象,不要使用反射,否则将会实例化一个新对象。

2).不要做断开单例类对象与类中静态引用的危险操作。

3).多线程使用单例使用共享资源时,注意线程安全问题。

4).懒汉模式时注意线程同步问题,在高并发情况下会产生多个单例

5).长久未被使用的单例实例会被JVM的垃圾回收机制回收

 

Java 设计模式(三)-单例模式(Singleton Pattern)

原文:http://www.cnblogs.com/Devonmusa/p/6683626.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!