单例模式
概念:
顾名思义,就是只有一个实例。
作为对象的创建模式[GOF95], 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
要点:
一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
在下面的对象图中,有一个"单例对象",而"客户甲"、"客户乙" 和"客户丙"是单例对象的三个客户对象。
可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。
案例:
先看两段代码(注意描述部分与注释);
1,饿汉式单例类
/**
* @author wonter
* 描述:饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变
* 邮件: yiyu1@163.com
*/
public class Singleton {
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
private Singleton(){
//空构造 防止被其他类new
}
//外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
2,懒汉式单例类
/**
* @author wonter
* 比较: 这个方法比上面有所改进,不用每次都进行生成对象,只是第一次。使用时生成实例,提高了效率!
* 描述:懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的
* 邮件: yiyu1@163.com
*/
public class Singleton {
private static Singleton instance = null;
//抽象集团类,线程互斥,排队模式
public static synchronized Singleton getInstance() {
if (instance==null)// 线程1
instance=new Singleton();
//线程1后,才允许线程2运行
return instance;
}
}
好处:
单例模式属于构建模式之一,实例控制--伸缩性
缺点:
系统开销---开发混淆---对象生命周期
代理模式:
工厂模式