互联网、电商、产品、运营、文案策划、生活程序员架构算法设计模式和编程理论

设计模式——单例模式

2017-01-16  本文已影响50人  你期待的花开

单例模式(Singleton)

一种创建性模型,它用来确保只产生一个实例,并提供一个访问它的全局访问点.对一些类来说,保证只有一个实例是很重要的,比如有的时候,数据库连接或 Socket 连接要受到一定的限制,必须保持同一时间只能有一个连接的存在.

单例模式的类型:

一、饿汉模式

创建一个类,将其构造方法私有化,外界无法创建此类的对象,实例化一个对象,外界可以通过这个类的对象进行访问,当将这个实例化的对象变成私有对象时,此前使用的方法失效,这时可以为外界提供一个获取实例化对象的方法,使用public static进行修饰,外界可以通过这个方法访问这个类中的对象。

public class Singleton1 {
    //构造方法私有化
    private Singleton1(){

    }
    //创建类的唯一实例,使用private static修饰
    private static Singleton1 instance = new Singleton1();

    //提供一个获取实例的方法,使用public static修饰
    public static Singleton1 getInstance(){
        return instance;
    }
}

public class test {
    public static void main(String[] args){
        //饿汉模式
        Singleton1 s1 = Singleton1.getInstance();
        Singleton1 s2 = Singleton1.getInstance();
        if(s1==s2){
            System.out.println(true);
        }else {
            System.out.println(false);
        }
    }
}

二、饿汉模式

创建一个类,将其构造方法私有化,外界无法创建此类的对象,声明类的唯一实例,使用private static修饰,提供一个获取实例的方法getinstance,使用public static修饰.

public class Singleton2 {
    //构造方法私有化
    private Singleton2() {

    }
    //声明类的唯一实例,使用private static修饰
    private static Singleton2 instance;
    //提供一个获取实例的方法,使用public static修饰
    public static Singleton2 getinstance() {

        if (instance == null) {
            instance = new Singleton2();
        }
        return instance;
    }
}

public class test {
    public static void main(String[] args){
        //懒汉模式
        Singleton2 s3 = Singleton2.getinstance();
        Singleton2 s4 = Singleton2.getinstance();
        if(s3==s4){
            System.out.println(true);
        }else {
            System.out.println(false);
        }
    }
}

两种模式的测试结果都是true,那么这两种模式有什么相同点和区别呢?


首先两种方案的构造函数和公用方法都是静态的(static),实例和公用方法又都是私有的(private)。
区别在于以下几点:
1、饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变。懒汉式如果在创建类的同时未创建对象,线程是不安全的。
2、从实现方式来讲他们最大的区别就是懒汉式是延时加载,它是在需要的时候才创建对象,而饿汉式在虚拟机启动的时候就会创建,饿汉式无需关注多线程问题、写法简单明了、能用则用。但是它是加载类时创建实例。

上一篇 下一篇

猜你喜欢

热点阅读