设计模式之单例模式

先说说为何要开始学习设计模式

工做已经一年之久,不少时间心思大多都花在需求的完成上,需求的完成度很高,可是设计呢?数据库

有没有考虑过你所实现的代码是否有设计在其中呢?设计模式

若是没有的话接下来和我一块儿学习设计模式哈~(不必定学习了设计模式就能提升你的设计,可是总归会有帮助)安全

什么是设计模式

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、通过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。多线程

设计模式的分类

按目的分类:工具

  • 建立型:主要用于建立对象。
  • 结构型:主要用于处理类或对象的组合。
  • 行为型:主要用于描述对类或对象怎样交互和怎样分配职责。

按范围分类:(模式主要是用于处理类之间关系仍是处理对象之间的关系)学习

  • 类模型:处理类和子类之间的关系,这些关系经过继承创建,在编译时刻就被肯定下来,是属于静态的。
  • 对象模型:处理对象间的关系,这些关系在运行时刻变化,更具动态性。

大概介绍了一些知识点,接下里咱们进入设计模式的学习--单例模式

单例模式的定义

确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。 单例模式是一种对象建立型模式。网站

从他的定义咱们能够看到有三个特色:spa

  • 实例惟一
  • 自行建立
  • 全局访问

让咱们看看单例模式的类图是什么样子

咱们能够看到:一个私有的当前类型的成员变量,一个私有的构造方法,一个 getInstance 方法。

建立对象再也不经过new 而经过 getInstance 让该类自行建立。线程

接下来就是单例模式的实现啦

给你们介绍几种可用的单例模式的实现:设计

一 饿汉式(静态常量)

/**
 * 饿汉式(静态常量)
 */
class Singleton {
    private static final Singleton Instance = new Singleton();

    static Singleton getInstance() {
        return Instance;
    }

    private Singleton() {
    }
}
复制代码

优势:简单,使用时没有延迟;在类装载时就完成实例化,天生的线程安全

缺点:没有懒加载,启动较慢;若是从始至终都没使用过这个实例,则会形成内存的浪费。

二 饿汉式(静态代码块)

/**
 * 饿汉式(静态代码块)
 */
class Singleton {
    private static Singleton Instance;

    static {
        Instance = new Singleton();
    }

    private Singleton() {
    }

    public static Singleton getInstance() {
        return Instance;
    }
}
复制代码

这种是将类实例化的过程放在了静态代码块中,在类装载的时执行静态代码块中的代码,初始化类的实例。

优缺点同上。

3、双重检查(DCL)

/**
 * 双重检查(DCL)
 */
public class Singleton {

    private static volatile Singleton Instance;

    private King() {
    }

    public static Singleton getKingInstance() {
        if (Instance == null) {
            synchronized (Singleton.class) {
                if (Instance == null){
                    Instance = new Singleton();
                }
            }
        }
        return Instance;
    }
}
复制代码

优势:线程安全;延迟加载;效率较高。

缺点:JDK < 1.5 的时候不可用

如今你们基本都是jdk1.8,因此也不存在这个问题。那为何不可用呢?你们能够学习一下哈

使用场景

咱们学习了怎么实现,那何时咱们须要采用单例模式呢?

单例模式只容许建立一个对象,所以节省内存,加快对象访问速度,所以对象须要被公用的场合适合使用,如多个模块使用同一个数据源链接对象等等。好比:

  • 须要频繁实例化而后销毁的对象
  • 建立对象时耗时过多或者耗资源过多,但又常常用到的对象
  • 有状态的工具类对象
  • 频繁访问数据库或文件的对象

给你们介绍下具体的使用场景:

  • 好比网站的计数器,通常也是采用单例模式实现,不然难以同步
  • 多线程的线程池的设计通常也是采用单例模式,这是因为线程池要方便对池中的线程进行控制
  • 数据库链接池的设计通常也是采用单例模式,由于数据库链接是一种数据库资源。主要是节省打开或者关闭数据库链接所引发的效率损耗
  • ...

这是几个比较经常使用的,你们能够参考这些想一下在本身的项目中是否采用了单例模式呢?又或者哪里也可使用单例模式呢?

概述

其实单例模式的实现还有其余的实现方式,好比线程安全等等的,可是根据各方面,效率等因素,不推荐使用。

因此我在这里就只总结几个推荐你们使用的单例模式的实现。但愿对你们有用。

相关文章
相关标签/搜索