模式的秘密---单例模式

来源:互联网 发布:淘宝里的地址怎么修改 编辑:程序博客网 时间:2024/05/16 16:19
网址:http://www.imooc.com/learn/112


单例模式是Java中最常用的设计模式之一,它通过阻禁止外部实例化和修改,对象的方式来控制所创建的对象的数量。这个概念可以被广泛地推广到仅使用有一个现存的对象能更高效运行的系统,或者是限制在若干个对象实例化为特定的数目的高效系统环境系统中。


单例模式的应用场景是当全局中某一个类的实例只需要一个。

当然可以说我自己只创建一个便可。但如果不小心忘记了,或者程序太大了,多个人可能都需要使用该实例,我们必须记住是否有人已经创建了这个实例,如果没有创建,没有自己要去创建,如果有人创建了,我们不能再去创建,并且还要查找到已创建实例的变量名,这是一个十分麻烦的过程。

单例模式可以从源头来解决这种事情的发生。

单利模式有2种,饿汉式 和 懒汉式

单例模式的饿汉式实现

package com.DesignPattern.singleton;/** * Created by LnvGump on 2017/10/1. * ele汉模式 */public class Singleton {    //1.构造函数私有化,外界不能直接创建实例    private Singleton(){    }    // 2.创建类的唯一实例    //  变量 1.private 是私有的,不能直接访问。2.static 是静态的,即是属于这个类本身的,当类产生时就会创建。    private static Singleton instance = new Singleton();    //3.获取这个类中静态变量的方法    public static Singleton getInstance(){        return instance;    }}

单例模式的懒汉式实现

package com.DesignPattern.singleton;/** * Created by LnvGump on 2017/10/1. * 懒汉模式 */public class Singleton2 {    //1.将构造函数私有化,不允许外直接创建对象    private Singleton2(){    }    //2.创建类的唯一实例,使用private static修饰 ,私有不允许直接访问,static 该变量名属于类,但在类载入时只生成变量名,不实例化。    private static Singleton2 instance;    //3.提供一个用于获取实例的方法,使用public static  修饰    //static 使用户通过 类可以直接访问。    //当instance为null时才创建,若已经创建了就返回该实例。所以该函数第一次调用时才会创建该实例。    public static Singleton2 getInstance(){        if(instance==null){            instance = new Singleton2();        }        return instance;    }}


main方法及两种实现方式的分析

package com.DesignPattern.singleton;/*    区别:饿汉模式 加载类时比较慢,但运行时获取对象的速度比较快,线程安全          懒汉模式,加载类时比较快,但是运行时获取对象的速度比较慢,线程不安全*/public class Main {    public static void main(String[] args) {        //饿汉模式        Singleton s1 = Singleton.getInstance();        Singleton s2 = Singleton.getInstance();        if(s1 == s2 ){            System.out.println("s1 和 s2 是同一个实例");        }        else{            System.out.println("s1 和 s2 不是同一个实例");        }        //懒汉模式        Singleton2 s3 = Singleton2.getInstance();        Singleton2 s4 = Singleton2.getInstance();        if(s3 == s4){            System.out.println("s3 和 s4 是同一个实例");        }        else{            System.out.println("s3 和 s4 不是同一个实例");        }    }}








原创粉丝点击