文档章节

小菜学设计模式——单例模式

learn_more
 learn_more
发布于 2015/06/19 12:06
字数 1268
阅读 264
收藏 8


背景

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


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
     * <code>Calendar</code> 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、模式类图

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;
 }
}




© 著作权归作者所有

learn_more
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
迈向大牛的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。 为什么用户提出需求变更后,大牛只需潇洒地敲敲键...

一枚Sir
2015/04/10
322
0
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0
设计模式已经陨落了?

你现在是坐在一个程序员旁边吗?如果是的话,那么在你读下面的段落之前,有一个简单的实验。让他们到一边去,问问他们两个问题并记录下答案。首先问他们“什么是设计模式?”然后再问“说出你...

oschina
2014/03/11
9.4K
69
《JavaScript设计模式与开发实践》最全知识点汇总大全

系列文章: 《JavaScript设计模式与开发实践》基础篇(1)—— this、call 和 apply 《JavaScript设计模式与开发实践》基础篇(2)—— 闭包和高阶函数 《JavaScript设计模式与开发实践》模式...

嗨呀豆豆呢
01/04
0
0
编程中的那些套路——关于策略模式

该文章属于《编程中的那些经典套路——设计模式汇总》系列,并且以下内容基于语言PHP 今天讲讲策略模式,策略模式 和工厂模式十分相像(或者说在代码逻辑层面,他们是一样的)。 但策略模式与...

gzchen
2018/08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
231
4
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部