1、单例模式通常写法
public class Singleton {
/**
* 单例模式通用写法
*/
private static final Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
2、单例模式之恶汉模式
public class SingletonByHungry {
/**
* 饿汉试单例模式 ,系统初始化时,就久初始化所有的单例,可能存在空间浪费,
*/
private static final SingletonByHungry instanace;
static {
instanace = new SingletonByHungry();
}
private SingletonByHungry() {
}
public SingletonByHungry getInstanace() {
return instanace;
}
}
3、单例模式之懒汉模式
public class SingletonByLazy {
private static SingletonByLazy instance = null;
/**
* 懒汉模式,需要用时在初始化,加载
* 疑问: 在多线程情况下,这种创建方式时存在问题的,new SingletonByLazy() 这个过程是非原子操作的
*/
private SingletonByLazy() {
}
public SingletonByLazy getInstance() {
if (instance == null) {
return new SingletonByLazy();
}
return instance;
}
}
4、单例模式之懒汉模式(加锁)
public class SingletonByLazyLock1 {
/**
* 通过加锁,控制创建单例
*/
private static SingletonByLazyLock1 instance = null;
private SingletonByLazyLock1() {
}
public synchronized static SingletonByLazyLock1 getInstance() {
if (instance == null) {
return new SingletonByLazyLock1();
}
return instance;
}
}
public class SingletonByLazyLock3 {
/**
* 通过加锁,控制创建单例,双重加锁
*/
private volatile static SingletonByLazyLock3 instance = null;
private SingletonByLazyLock3() {
}
public static SingletonByLazyLock3 getInstance() {
if (instance == null) {
synchronized (SingletonByLazyLock3.class) {
if (instance == null) {
}
return new SingletonByLazyLock3();
}
}
return instance;
}
}
单例模式
优点:
1、可以保证内存只存在一个实例,减少内存开销
2、避免对资源多重占用
3、单例模式设置全局访问节点,优化和共享资源的访问
缺点:
1、没有借口,扩展困难,如需扩展需要修改原有代码,违背开闭原则
2、容易违背单一职责原则