确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
创建类模式
1)多个虚拟机
当系统中的单例类被拷贝运行在多个虚拟机下的时候,在每一个虚拟机下都可以创建一 个实例对象。在使用了 EJB、JINI、RMI 技术的分布式系统中,由于中间件屏蔽掉了分布式 系统在物理上的差异,所以对你来说,想知道具体哪个虚拟机下运行着哪个单例对象是很困 难的。 因此,在使用以上分布技术的系统中,应该避免使用存在状态的单例模式,因为一个有 状态的单例类,在不同虚拟机上,各个单例对象保存的状态很可能是不一样的,问题也就随 之产生。而且在 EJB 中不要使用单例模式来控制访问资源,因为这是由 EJB 容器来负责的。 在其它的分布式系统中,当每一个虚拟机中的资源是不同的时候,可以考虑使用单例模式来 进行管理。
2)多个类加载器
当存在多个类加载器加载类的时候,即使它们加载的是相同包名,相同类名甚至每个字 节都完全相同的类,也会被区别对待的。因为不同的类加载器会使用不同的命名空间 (namespace)来区分同一个类。因此,单例类在多加载器的环境下会产生多个单例对象。
3)错误的同步处理
在使用上面介绍的懒汉式单例模式时,同步处理的恰当与否也是至关重要的。不然可能 会达不到得到单个对象的效果,还可能引发死锁等错误。因此在使用懒汉式单例模式时一定 要对同步有所了解。不过使用饿汉式单例模式就可以避免这个问题。
1)内存中只存在一个实例,节省空间
2)避免频繁创建销毁,减少系统性能开销
3)可避免对资源的多重占用,如:写时避免重复写
4)可在系统设置全局的访问点,如:可用单例类来负责所有数据表的映射
1)单列模式无接口,不可拓展
2)并行开发环境中,单例模式未完成时,无法进行单元测试,也不能用mock的方式虚拟一个对象
3)单例模式与单一职责原则冲突。
1)要求生成唯一序列号的环境。
2)需要定义大量静态常量和静态方法的环境,如:工具类。
3)创建的对象消耗的资源过多时,如:访问I/O或数据库等资源。
4)项目中需要全局共享访问点或共享数据时,
5)需要频繁实例化然后销毁的对象。
1)饿汉模式
2)懒汉模式
3) 注册模式
1).只能使用单例类提供的方法得到单例对象,不要使用反射,否则将会实例化一个新对象。
2).不要做断开单例类对象与类中静态引用的危险操作。
3).多线程使用单例使用共享资源时,注意线程安全问题。
4).懒汉模式时注意线程同步问题,在高并发情况下会产生多个单例
5).长久未被使用的单例实例会被JVM的垃圾回收机制回收
Java 设计模式(三)-单例模式(Singleton Pattern)
原文:http://www.cnblogs.com/Devonmusa/p/6683626.html