java模式之单例模式:
单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
特点:
1,一个类只能有一个实例
2,自己创建这个实例
3,整个系统都要使用这个实例
例子:
Windows 回收站
在整个视窗系统中,回收站只能有一个实例,整个系统都使用这个惟一的实例,而且回收站自行提供自己的实例。因此,回收站是单例模式的应用。
俩种形式:
1,饿汉式单例类[加载时候慢一些,需要实例化]:
public class Singleton {
//在自己内部定义自己一个实例,注意这是private只供内部调用,不允许外界再创建对象;
private Singleton(){}
private statc Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstanc() { return instance; } }
2,懒汉式单例类[线程不安全,加载时候比饿汉式快一些,但是作为第一次被实例化对象的很悲催]:
public class Singleton {
private static Singleton instance = null;
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次使用时生成实例,提高了效率!
public static synchronized Singleton getInstance()
{
if (instance==null)
instance=new Singleton();
return instance;
}
}
问题?
1,既然使用单例类的实例都唯一,可以不可以用一个静态类统一管理这些单例?
解答:
1.单例可以继承 静态类不可以
2.单例可以控制初始化 静态类不可以
3.单例一般要联系类里已有数据 静态类一般组织域逻辑,比如说:Math.floor(num)。
4.使用单例[便于调试,节省内存资源];使用静态类[调用方便];
2,什么情况下建议使用单例模式呢?
解答:
1.从面向对象角度去说的话,比如说现在为太阳系设计一个系统.
有个接口 叫 Planet(星球),有一个实现类叫Earth表示地球,地球只有一个,怎么办,用单例 !
2.单纯从编程的角度出发,单例可以节省不必要的内存开销,屏蔽对象创建的复杂性,如果你知道spring并且知道bean默认是单例的,也许会有点感觉,为什么要这样。
优缺点?
主要优点:
1、提供了对唯一实例的受控访问。
2、由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
3、允许可变数目的实例。
主要缺点:
1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
2、单例类的职责过重,在一定程度上违背了“单一职责原则”。
3、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。