设计 模式(单例模式)

2018-03-12  本文已影响0人  黑客和白帽子的故事

简介:

单例 模式:是一种常用的软件设计模式,在它的核心结构中值包含一个被称为单例的特殊类。一个类只有一个实例,即一个类只有一个对象实例。

这样的模式有几个好处:

但是也有缺点:
当想实例化一个单例类的时候,必须记住使用相应的获取对象的方法,而不能使用new。当看不到源码的时候,很困扰

单例模式可以分为懒汉式和饿汉式:

懒汉式单例模式:在类加载时不初始化。
饿汉式单例模式:在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快。

代码实现八种单例模式:

优点:书写简单,类装载的时候就完成实例化。避免了线程同步问题。
缺点:在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费。

public class SingletonOne {
    private final static SingletonOne SINGLETON_ONE = new SingletonOne();

    private SingletonOne() {
    }

    public static SingletonOne getInstance() {
        return SINGLETON_ONE;
    }
}
public class SingletonTwo {
    private static SingletonTwo singletonTwo;

    static {
        singletonTwo = new SingletonTwo();
    }

    private SingletonTwo(){}

    public SingletonTwo getInstance(){
        return singletonTwo;

    }
}
public class SingletonThree {
    private static SingletonThree singletonThree;

    private SingletonThree() {
    }

    public static SingletonThree getInstance() {
        if (singletonThree == null) {
            singletonThree = new SingletonThree();
        }
        return singletonThree;
    }

}
public class SingletonThree {
    private static SingletonThree singletonThree;

    private SingletonThree() {
    }

    public static  synchronized SingletonThree getInstance() {
        if (singletonThree == null) {
            singletonThree = new SingletonThree();
        }
        return singletonThree;
    }

}

由于第四种实现方式同步效率太低,所以摒弃同步方法,改为同步产生实例化的的代码块。但是这种同步并不能起到线程同步的作用。跟第3种实现方式遇到的情形一致,假如一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。

public class SingletonFive {

    private static SingletonFive singletonFive;

    private SingletonFive() {}

    public static SingletonFive getInstance() {
        if (singletonFive == null) {
            synchronized (SingletonFive.class) {
                singletonFive = new SingletonFive();
            }
        }
        return singletonFive;
    }
}

优点:线程安全;延迟加载;效率较高。

public class SingletonSix {

private static volatile SingletonSix singletonSix;

private  SingletonSix(){}

public static SingletonSix getInstance(){
    if(singletonSix == null){
        synchronized (SingletonSix.class){
            if(singletonSix == null){
                singletonSix = new SingletonSix();
            }
        }
    }
    return singletonSix;
}

}

public class Singleton {

    private Singleton() {}

    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}

缺点:实际开发中,没有 人使用这种开发 模式

public enum SingletonEight {
    INSTANCE;
    public void whateverMethod() {

    }
}

参考文章:https://www.cnblogs.com/zhaoyan001/p/6365064.html

上一篇 下一篇

猜你喜欢

热点阅读