设计模式之单利模式

347 阅读2分钟

1.什么是单利模式?

一个系统中一个类只有一个对象的实例,实现这种功能的方式就叫做单利模式

2.为什么使用单利模式?

节省公共资源,比如一家五口人,每个人都要吃饭,但没必要每个人都用不同的锅来做饭吧,一家人都用同一口锅。

3.单利模式的实现方式

public class Singleton {
    //限制实例
    private static final Singleton singleton  = new Singleton();

    //私有化构造方法
    private Singleton() {
    }

    /**
     * 类加载时就创建对象,
     * @return
     */
    public static Singleton getSingleton(){
        return singleton;
    }
}
//创建测试类,用for循环输出创建的实例
public class test {

    public static void main(String[] args) {
        for (int i = 0; i <10; i++) {
            Singleton singleton = Singleton.getSingleton();
            System.out.println(singleton);
        }

    }
}

输出结果:这里的实例在类初始化时就已经加载完成,不能再进行第二次初始化了

若在创建实例的时候返回new Singleton(); 输出结果如下

4.单利模式的区别

上述第一个属于饿汉式,并且线程安全,在类加载的时候就完成了初始化,避免了线程同步的问题,缺点是没有起到懒加载的作用,可能会造成资源浪费(没有使用却实例化了)

第二种是懒汉式:代码如下

public class Singleton {

    private static Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

在创建实例时多加了一层判断,虽然起到了懒加载的作用,但是线程不安全,在高并发情况下若一个线程进入if判断切未执行下一步操作,另一个线程也进入if判断,会造成创建多个实例。

解决办法:在创建实例的方法上加synchronized,虽然线程安全了,但是每次获取实例都要进行同步操作,效率极低。

5.使用懒汉式还是饿汉式取决于使用场景,需要根据实际情况选择