设计模式之单例模式

12人阅读 评论(0) 收藏 举报
  1. 定义
  2. 特点
  3. 要点
  4. 常见问题

定义

单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。

特点

  1. 单例类只能有一个实例。
  2. 单例类必须自己自己创建自己的唯一实例。
  3. 单例类必须给所有其他对象提供这一实例。

要点

  1. 私有的构造方法
  2. 指向自己实例的私有静态引用
  3. 以自己实例为返回值的静态的公有的方法

分类

饿汉式单例
(饿汉式单例在单例类被加载时候,就实例化一个对象交给自己的引用)

public static Singleton{
    private static Singleton singleton=new Singleton();
    private Singleton() { }
    public static Singlenton getInstance(){
        return singleton;
    }
}

懒汉式单例
懒汉式在调用取得实例方法的时候才会实例化对象。

public class Singleton{
    private static Singleton singleton;
    private Singleton() { }
    public static Synchronized Singleton getInstance(){
        if(singleton ==null){
            singleton=new Singleton();
        }
        return singleton;
    }
}

双重锁的形式

public class Singleton{
    private static volatile Singleton instance=null;
    private Singleton() { }
    public static Singleton (){
        if(instance==null){
            synchronized(SingletonClass.class){
                if(instance==null){
                    instance=new Singleton();
                }
            }
        }
        return instance;
    }
}

常见问题

单例模式的对象长时间不用会被jvm垃圾收集器收集吗
除非人为地断开单例中静态引用到单例对象的联接,否则jvm垃圾收集器是不会回收单例对象的。
jvm卸载类的判定条件如下:
1,该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
2,加载该类的ClassLoader已经被回收。
3,该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。
只有三个条件都满足,jvm才会在垃圾收集的时候卸载类。显然,单例的类不满足条件一,因此单例类也不会被回收。

在一个jvm中会出现多个单例吗?
在分布式系统、多个类加载器、以及序列化的的情况下,会产生多个单例,这一点是无庸置疑的。那么在同一个jvm中,会不会产生单例呢?使用单例提供的getInstance()方法只能得到同一个单例,除非是使用反射方式,将会得到新的单例。

在getInstance()方法上同步有优势还是仅同步必要的块更优优势?
因为锁定仅仅在创建实例时才有意义,然后其他时候实例仅仅是只读访问的,因此只同步必要的块的性能更优,并且是更好的选择。缺点:只有在第一次调用的时候,才会出现生成2个对象,才必须要求同步。而一旦singleton 不为null,系统依旧花费同步锁开销,有点得不偿失。

单例类可以被继承吗?
根据单例实例构造的时机和方式不同,单例模式还可以分成几种。但对于这种通过私有化构造函数,静态方法提供实例的单例类而言,是不支持继承的。这种模式的单例实现要求每个具体的单例类自身来维护单例实例和限制多个实例的生成。但可以采用另外一种实现单例的思路:登记式单例,来使得单例对继承开放。

查看评论

Java设计模式之一 单例设计模式

设计模式: 设计模式的概念首先来源于其它行业:建筑业,在早起建房子的时候,肯定是经验缺乏、显得杂乱无序的,这就会造成很多问题,在行业发展过程,通过不断的经验积累,前辈们针对这些问题提出了合理解决方案...
  • qq_32736689
  • qq_32736689
  • 2016年04月07日 08:29
  • 2529

设计模式的C++实现 1.单例模式

单例模式即实现单例类,即系统中一个类只有一个实例,而且该实例易于外界访问。这样方便对实例个数进行控制并节约系统资源。 而单例常用与一些非局部静态对象,对于这些对象,程序难以控制,对于这些存在与全局,且...
  • qq981932962
  • qq981932962
  • 2014年10月12日 20:47
  • 1052

PHP 设计模式之单例模式

{CSDN:CODE:fdsfs} {CSDN:CODE:fds}
  • linux_PHP_
  • linux_PHP_
  • 2013年11月08日 18:05
  • 708

浅谈JAVA设计模式之——单例模式(Singleton)

一、概述        保证一个类仅有一个实例,并提供一个访问它的全局访问点。 二、适用性      1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。      2.当这个唯一...
  • l1028386804
  • l1028386804
  • 2015年05月02日 17:50
  • 1179

Android面试设计模式之单例模式

在面试的时候面试官会问我们常用的一些设计模式,这里先介绍一下单例模式。 为什么要使用单例模式 1.控制资源的使用,通过线程同步来控制资源的并发访问; 2.控制实例产生的数量,达到节约系统资源; 3...
  • qq_435559203
  • qq_435559203
  • 2016年09月12日 18:25
  • 674

23种设计模式之单例模式

我们也经常遇到类似的情况,为了节约系统资源,有时需要确保系统中某个类只有唯一一个实例,当这个唯一实例创建成功之后,我们无法再创建一个同类型的其他对象,所有的操作都只能基于这个唯一实例。为了确保对象的唯...
  • u010687392
  • u010687392
  • 2014年12月27日 16:36
  • 777

java 单例设计模式使用场景

单例设计模式的使用场景说明,优缺点,在线程中该使用那种方式的单例,其中涉及到类在JVM中的分配......
  • bob_Xing_Yang
  • bob_Xing_Yang
  • 2017年05月23日 10:53
  • 484

设计模式:这是最全面 & 详细的 单例模式(Singleton)分析指南

前言 今天我来全面总结一下Android开发中最常用的设计模式 - 单例模式。 关于设计模式的介绍,可以看下我之前写的:1分钟全面了解“设计模式” 目录 1. 实例引入...
  • carson_ho
  • carson_ho
  • 2016年08月16日 17:15
  • 4543

设计模式(二)单例模式的七种写法

面试的时候,问到许多年轻的Android开发他所会的设计模式是什么,基本上都会提到单例模式,但是对单例模式也是一知半解,在Android开发中我们经常会运用单例模式,所以我们还是要更了解单例模式才对。...
  • itachi85
  • itachi85
  • 2016年01月17日 10:29
  • 24947
    个人资料
    持之以恒
    等级:
    访问量: 153
    积分: 94
    排名: 142万+
    文章分类
    文章存档
    最新评论