一、单例模式定义
单例模式定义:Ensure a class has only one instance ,and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例)。
二、单例模式的优点
1.单例模式在内存中只有一个实例,减少内存开支
2.单利模式只有一个实例,减少了系统性能开销
3.单例模式避免了可以对资源的多重占用,例如一个我写文件操作,由于只有一个实例存在避免了对一个资源文件的同时写操作。
4.单例模式可以在系统设置全局的访问点,优化和共享资源访问。
三、单例模式的缺点
1.单例模式没有接口,扩展困难。
2.单例模式对测试不利,并发环境单例模式没有完成不能进行测试。
3.单例模式与单一职责原则有冲突。一个类应该只实现一个逻辑,而不关心他是否是单例的,是不是要单例取决于环境。
四、单例模式代码实现
懒汉式:
//懒汉式单例类.在第一次调用的时候实例化自己
public class Singleton {
private Singleton() {}
private static Singleton single=null;
//静态工厂方法
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
但是线程是不安全的需要做改进,改进方法有:
1、在getInstance方法上加同步
public static synchronized Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
2、双重检查锁定
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
3、静态内部类
public class Singleton {
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
这种比上面1、2都好一些,既实现了线程安全,又避免了同步带来的性能影响。
饿汉式:
//饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton1 {
private Singleton1() {}
private static final Singleton1 single = new Singleton1();
//静态工厂方法
public static Singleton1 getInstance() {
return single;
}
}
饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。