码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式(一)__单例设计模式

时间:2015-09-23 10:13:30      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

先来介绍一下什么是设计模式,设计模式起先是从建筑行业借鉴来的,然后慢慢发展到了今天这个样子。

设计模式是解决问题最行之有效的思想,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

java有23种设计模式,今天就先来介绍一种:单例设计模式

单例设计模式:

  有时候当你需要保证一个类在内存中的对象唯一性的时候,比如多程序读取一个配置文件时,建议配置文件封装成对象。会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象,就需要该配置文件对象在内存中是唯一的。那么这时候你就需要用到单例设计模式了。

  那么,如何保证对象的唯一性呢?

    思想:

    1. 不让其他类创建该类对象。
    2. 在本类中创建一个本类对象
    3. 对外提供方法,让其他程序获取这个对象

    步骤:

      1. 因为创建对象都需要构造函数初始化,所以只需要将本类中的构造函数私有化,这样其他类就不能创建该类对象了。

      2. 在本类中创建一个本类对象

      3. 定义一个公有方法,返回该对象,让其他类访问。(作用:可控) 

好了,上面就把单例模式的思路给大家说了下,单例模式的写法有好几种,这里主要介绍两种:懒汉式单例、饿汉式单例。

一:饿汉式

class Single {
    private Single() {} // 私有化构造函数。

    private static final Single s = new Single(); // 创建私有并静态的本类对象。

    public static Single getInstance() { // 定义公有并静态的方法,返回该对象。
        return s;
    }
}

饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。

二:懒汉式

class Single {
    private Single() {}

    private static Single s = null;

    public static Single getInstance() {
        if (s == null)
            s = new Single();
        return s;
    }
}

但是以上懒汉式单例的实现没有考虑线程安全问题,它是线程不安全的,并发环境下很可能出现多个Single实例,要实现线程安全,可通过多判断加同步来解决。

class Single {
    private Single() {};

    private static Single s = null;

    public static Single getInstance() {
        if (s == null) {
            synchronized (Single.class) {
                if (s == null) {
                    s = new Single();
                }
            }
        }
        return s;
    }
}

三:饿汉式和懒汉式区别

饿汉比较急,类一旦加载,就把单例初始化完成。

懒汉太懒了,只有当调用getInstance的时候,才会去初始化这个单例。

饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题。

懒汉式本身是非线程安全的。

饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成。

而懒汉式顾名思义,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,而且因为线程安全问题,需要加同步,效率上比较低。

 

设计模式(一)__单例设计模式

标签:

原文地址:http://www.cnblogs.com/makaruila/p/4831342.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!