博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小菜学设计模式——单例模式
阅读量:5891 次
发布时间:2019-06-19

本文共 2724 字,大约阅读时间需要 9 分钟。

hot3.png

背景

     保证只有一个实例时,你是否会想到单例模式

1、使用意图

    保证只有一个实例,比如帮助窗体,没必要维护多个实例

2、生活实例

   地球只有一个(不知道算不算单例的体现)

 

3、Java 例子(框架、JDK 、JEE)

    单例模式的例子数不胜数,很常见的例子就是Spring的Controller是一个单例,但是如果按照单例模式编码规则来说,Servlet不是单例,但是他确实单实例,意思是Web容器只维护一个Servlet对象,其实也可以等同为单例的结果。另外,也不要一看到类名.getInstance()就以为那是单例模式,比如 Calendar.getInstance() 他不是单例模式,得到的对象都是不同是的实例。

  /**     * Gets a calendar using the default time zone and locale. The     * Calendar returned is based on the current time     * in the default time zone with the default locale.     *     * @return a Calendar.     */    public static Calendar getInstance()    {        Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault());         cal.sharedZone = true;         return cal;    }

4、模式类图

120556_SZyi_1989321.jpeg

120623_BO54_1989321.png

5、模式优点

    单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。

   通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。

    因为Singleton类封装它的唯一实例,这样它可以严格地控制客户怎样访问它以及何时访问它。简单的说就是对唯一实例的受控访问。

    单例模式编写最关键的一点是保证方法私有,同时获取实例时保证只有一个对象实例。

6、与类似模式比较

    单例模式中主要需要解决的是两个问题:全局访问和实例化控制问题。

    静态初始化方式是在自己被加载时就将自己实例化,被形象的称为饿汉式单例类。这种方式是类一加载就实例化的对象,要提前占用系统资源。 

     原先的单例模式处理方式第要在第一次被引用时,才会将自己实例化,所以称为懒汉式单例类。该方式面临着多线程访问的安全性问题,需要双重锁定这样的处理才能达到保证安全。

    谈到单例,我觉得他和静态类还是要说说的,比如数学类这个静态类,静态类一加载,所有方法都会被加载到内存中,他是一种无状态的类,也就是没有实例拥有自己独有的属性,这种类一般就是工具类;然而,单例则不同,他自己内部保存了一份实例,这个实例就是维持了自身的状态,所以这是不同的;另外,因为静态所有的方法都为静态,所以,不能继承,但是单例不一样,单例的方法同样都不是静态的,他是可以继承的。二者共同点是构造方法都私有化。

7、代码实现

1)普通单例(一般单例只要保证构造方法私有),这种单例不安全,原因是多线程访问可能导致产生不止一个实例

/**

 * Singleton model (懒汉式单例) *@author:Heweipo *@version 1.00 * */public class Singleton { private static Object lock = new Object(); private static Singleton instance; private Singleton(){  // do nothing } public static Singleton getInstance(){  if(instance == null){     instance = new Singleton();  }  return instance; }}

2)多线程单例,Double-Check Locking 双重锁定(在第一次被引用时,才会将自己实例化,所以也称之为 懒汉单例)

/**

 * Singleton model (懒汉式单例) *@author:Heweipo *@version 1.00 * */public class Singleton { private static Object lock = new Object(); private static Singleton instance; private Singleton(){  // do nothing } public static Singleton getInstance(){  // 其实可以在方法最外层枷锁,但是那样的话势必会影响性能,因为为空的情况只有一次出现  if(instance == null){   // 枷锁lock,在这之前是可能有多个方法还未初始化单例时进入的,所以后面还有判断一次   synchronized(lock){    // 如果引用为空,那么实例化单例,这里为什么还要判断呢?目的是防止多个方法同时进入    if(instance == null){     //单例首次实例化     instance = new Singleton();    }   }  }  return instance; }}

3)静态初始化(在自己被加载时就将自己实例化,被称为饿汉式单例类,提前占用系统资源,不过更加建议使用这种,简洁)

/** * Singleton model (饿汗式单例) *@author:Heweipo *@version 1.00 * */public class Singleton { // 类加载时就实例化对象 private static Singleton instance = new Singleton(); private Singleton(){  // do nothing } public static Singleton getInstance(){  // 直接返回单例  return instance; }}

转载于:https://my.oschina.net/heweipo/blog/468763

你可能感兴趣的文章
【转】EDK简单使用流程(3)
查看>>
仿射变换
查看>>
分页器(自定制)
查看>>
视频直播点播nginx-rtmp开发手册中文版
查看>>
PHP队列的实现
查看>>
单点登录加验证码例子
查看>>
[T-SQL]从变量与数据类型说起
查看>>
occActiveX - ActiveX with OpenCASCADE
查看>>
BeanUtils\DBUtils
查看>>
Android利用文本分割拼接开发一个花藤文字生成
查看>>
[转]理解Linux文件系统之inode
查看>>
python模块--os模块
查看>>
HSSFRow获取单元格方法与区别
查看>>
删除UINavigationItem上的BarButtonItem
查看>>
数据分析相关模块
查看>>
Python数据结构1-----基本数据结构和collections系列
查看>>
SQL Denali-FileTable
查看>>
C# 图像处理:复制屏幕到内存中,拷屏操作
查看>>
PHP微信支付流程
查看>>
linux下单节点oracle数据库间ogg搭建
查看>>