单例模式

设计模式:

     在软件开发中,经过大家公认的,用于在特定环境下特定问题的解决方案,不是具体的代码,而是实际情景中的解决方案。

几乎所有模式有以下面向对象原则:

1.对接口编程而不是对实现编程

面向接口编程:解耦,增强扩展性

2.优先使用对象组合而不是继承

设计模式的三大类:创建型模式,结构型模式,行为型模式

何为创建型模式:

       把复杂对象的创建过程加以抽象,通过子类继承和重写方法,来得到具有复合属性的对象。

单例模式:

一个对象只有一个实例,如:数据库操作,线程池,配置文件等等,属于全局资源。

有以下特点:

     1,一个单例类只能有一个实例;

     2,必须自己创建实例,使用时不需要考虑创建细节

     3,单例类向整个系统提供唯一的实例; 

优点:有利于节约内存空间,为整个框架提供共享变量,提高代码的重用性

运用场景:

1,资源共享的情况下,避免由于资源操作时导致的性能或损耗,如配置文件;

2,控制资源的情况下,方便资源的互相通信,如线程池;

单例模式的几种实现方式:饿汉式,懒汉式,双重验证式,类加载式,枚举式;

饿汉式:

代码: 

package org.yl;

/**
 * Created by yelei on 17-4-7.
 */
//饿汉式
public class SingletonClass {

    private static SingletonClass ONE=new SingletonClass();
    //私有构造器,只能类部访问,不能被实例化和继承
    private SingletonClass(){}
    //通过这个方法返回实例
    public static SingletonClass getInstance(){
        return ONE;
    }
   /* public void show(){
        System.out.println("饿汉式");
    }*/
}

测试类:

package org.yl;

/**
 * Created by yelei on 17-4-7.
 */
public class Test {
    public static void main(String[] args) {
        SingletonClass a=SingletonClass.getInstance();
        SingletonClass b=SingletonClass.getInstance();
        Z z1=new Z();
        Z z2=new Z();
        if (a==b){
            System.out.println("a==b");
        }
        if (z1!=z2){
            System.out.println("z1!=z2");
        }
    }
}

 

运行结果:

a==b
z1~=z2

Process finished with exit code 0

饿汉式的优点:不存在线程安全;

    缺点:项目已启动就创建,不能控制其创建的时间,也就是不能延迟创建。

懒汉式:

代码:

package org.yl;

/**
 * Created by yelei on 17-4-7.
 */
//饿汉式
public class SingletonClass {
    //这里先不创建实例
    private static SingletonClass ONE;
    //私有构造器,只能类部访问,不能被实例化和继承
    private SingletonClass(){}
    //通过这个方法返回实例
    public static SingletonClass getInstance(){
        //先判断是否已经创建了实例
        if (ONE==null){
            ONE=new SingletonClass();
        }
        return ONE;
    }
   /* public void show(){
        System.out.println("饿汉式");
    }*/
}

测试代码和运行结果和前面一致;

饿汉式的优点:可以延迟创建对象,缺点是会存在线程安全问题,所以有加锁的懒汉式:

 public synchronized static SingletonClass getInstance(){
        //先判断是否已经创建了实例
        if (ONE==null){
            ONE=new SingletonClass();
        }
        return ONE;
    }

加锁饿汉式的优点可以解决线程安全问题,但是同步效率低,每次使用ONE都必须同步等待。

posted @ 2017-04-07 11:24  叶子加雨  阅读(139)  评论(0编辑  收藏  举报