单例模式

学习一下 单例模式

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。

单例模式要点:

显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象。
单例模式实现方式:

1.预先加载法


class S1 {
    private S1() {
        System.out.println("ok1");
    }
    private static S1 instance = new S1();
    public static S1 getInstance() {
        return instance;
    }
}

优点:  

1.线程安全的

2.在类加载的同时已经创建好一个静态对象,调用时反应速度快。
缺点: 资源利用效率不高,可能getInstance永远不会执行到,但是执行了该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化了

2.initialization on demand,延迟加载法  (考虑多线程)

class S2 {
    private S2() {
        System.out.println("ok2");
    }
    private static S2 instance = null;
    public static synchronized S2 getInstance() {
        if (instance == null) instance = new S2();
        return instance;
    }
}

优点: 资源利用率高,不执行getInstance就不会被实例,可以执行该类其他静态方法。

缺点: 第一次加载时发应不快  ,多线程使用不必要的同步开销大

3.initialization on demand double check 双重检测( 考虑多线程 )

class S3 {
    private S3() {
        System.out.println("ok3");
    }

    private static S3 instance = null;

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

优点: 资源利用率高, 不执行getInstance就不会被实例,可以执行该类其他静态方法。

缺点: 第一次加载时发应不快  ,由于java 内存模型一些原因偶尔会失败

4.initialization on demand holder  (考虑多线程)
class S4 {
    private S4() {
        System.out.println("ok4");
    }
    private static class S4Holder {
        static S4 instance = new S4();
    }
    public static S4 getInstance() {
        return S4Holder.instance;
    }
}

优点: 资源利用率高, 不执行getInstance就不会被实例,可以执行该类其他静态方法。

缺点: 第一次加载时发应不快

总结: 一般采用 1 即可,若对资源十分在意也可考虑 4 ,不要使用2,3了。

引自:http://blog.csdn.net/it_man/article/details/5787567

模式动机

对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。
如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。
注:大部分内容都是转载自其他地方,等同于自己做的笔记方便自己以后学习,大家仅供参考。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值