在系统中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式。
1.单例模式的定义与特点
定义: 一个类只有一个对象,且该类能自行创建这个对象的一种模式
特点:
1.单例类只有一个对象
2.该单例对象由单例类自行创建
3.该单例类对外提供一个访问该单例的全局访问点
例子:
Windows只能打开一个任务管理器
数据库连接池
2.单例模式的结构与实现
普通类的构造函数是公有的,外部类可以通过“ new 构造函数()”来生成对象。单例类将构造函数私有,外部类无法调用构造函数生成对象,单例类定义一个静态私有对象,并向外提供一个静态的公有函数用于创建或获取该类的静态私有对象
2.1单例模式的结构
2.2单例模式的实现
单例模式有两种实现方式
1.懒汉式单例
类加载时没有生成实例,只有当第一次调用getInstance()方法时才去创建类的实例
public class LazySingleton {
private static LazySingleton instance = null;
private LazySingleton() {
}
public static LazySingleton getInstance() {
if (instance == null) {
instance= new LazySingleton();
}
return instance;
}
}
上面代码不能保证线程安全,编写多程序多线程,保证线程安全则如下实现
public class LazySingleton {
private static volatile LazySingleton instance = null;
private LazySingleton() {
}
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance= new LazySingleton();
}
return instance;
}
}
volatile和synchrinized关键词保证内存可见和给类加锁
2.饿汉式单例
类一旦加载就创建一个实例,保证调用getInstance()方法前实例已经存在
public class HungrySingleton
{
private static final HungrySingleton instance=new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getInstance()
{
return instance;
}
}
饿汉式单例在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以是线程安全的,可以直接用于多线程而不会出现问题。
3.单例模式的应用场景
- 当一个类只要生成一个对象时
- 当对象需要被共享时。由于单例模式只允许创建一个对象,共享该对象可以节省内存,并加快对象访问速度
- 当一个类需要被频繁的实例化,而创建的对象又被频繁的销毁时如多线程的线程池,网络连接池
4.单例模式扩展
单例模式可以扩展为多例模式,这种模式可成生成有限个对象并保存在ArrayList中