单例设计模式(一)

来源:互联网 发布:手机淘宝网客户端 编辑:程序博客网 时间:2024/05/16 17:03
1、引入
    在很多项目中,我们常常需要读取配置文件,也就是说在很多地方都需要创建对象帮我们完成任务。但是,在系统运行期间,系统会存在很多个这样的对象,而且每个对象里面都封装这配置文件的内容,这样会严重浪费内存。实际上,我们只需要一个对象就可以完成我们所需的任务。
2、单例设计模式
    保证一个类仅有一个实例,并提供一个访问它的全局访问点。
3、单例模式的结构说明

4、单例模式的实现
    懒汉式:马上要使用对象实例的时候才会创建,需要在getInstance方法里去判断。
               private static Singleton uniqueInstance = null;
    饿汉式:在装载类的时候就创建对象的实例。
            private static Singleton uniqueInstance = new Singleton();

懒汉式:
   package singleton;/** * 懒汉式单例设计模式 * @author Administrator * */public class Singleton {    /**     * 定义一个变量来存储创建好的类实例     */    private static Singleton uniqueInstance = null;    /**     * 私有化构造方法,可以在内部控制创建实例的数目     */    private Singleton(){    }    public static synchronized Singleton getInstance(){        //判断存储实例的变量是否有值        if(uniqueInstance==null){            //如果没有创建一个            return new Singleton();        }        return uniqueInstance;    }    /**     * 单例自己的方法     */    public void singletonOperation(){        System.out.println("Singleton's method.......");    }    /**     * 单例自己的属性     */    private String singletonData;}
饿汉式:
   package singleton;/** * 饿汉式单例设计模式 * @author Administrator * */public class Singleton1 {    /**     * 定义一个变量来存储创建好的类实例,直接在这里创建实例,只创建一次     */    private static Singleton1 uniqueInstance = new Singleton1();    /**     * 私有化构造方法,可以在内部控制创建实例的数目     */    private Singleton1(){    }    public static Singleton1 getInstance(){        //直接使用已创建好的实例        return uniqueInstance;    }    /**     * 单例自己的方法     */    public void singletonOperation(){        System.out.println("Singleton1's method.......");    }    /**     * 单例自己的属性     */    private String singletonData;}

5、单例设计模式中存在问题
    ①应该根据实际环境选择单例模式
    ②懒汉式在需要用的时候创建实例,节省了内存空间;饿汉式在类装载的时候就创建了实例节省了运行时间。
    ③懒汉式是线程不安全的,用的时候需要加同步锁,因为在运行时,有两个线程可能同时访问getInstance方法;饿汉式是线程安全的,类只会装载一次。
    ④给懒汉式加个同步锁 public static synchronized Singleton getInstance(){},他会降低整个访问速度,而且每次都要判断。可以使用双重检查加锁去解决。

双重检查加锁高效解决单例模式线程安全问题
http://blog.csdn.net/gxc312648465/article/details/50822342

0 0