定义:

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。三个特点:一个类只有一个实例;必需自己创建这个实例;必需自行向整个系统提供这个实例。

结构图:

  • Singleton:单例类,提供一个静态的getInstance()方法,供系统获取它的唯一实例;构造函数需要私有化;内部定义自身的一个静态变量,作为外部共享的唯一实例。

**Hungry Mode **

为了保证创建实例时的线程安全,可以使用Hungry Mode的方式初始化实例。

class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() { } public static EagerSingleton getInstance() {
return instance;
}
}
  • 在类的初始化的时候就直接创建实例,无需考虑多线程访问的问题,但无论系统是否需要改单例,都需要进行实例化。如果实例化复杂,则类加载时间较长,浪费系统资源。

Lazy Mode

为了解决初始化问题,可以在系统第一次调用的时候再生成实例。

class LazySingleton {
private static LazySingleton instance = null; private LazySingleton() { } synchronized public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
  • 在整个getInstance()方法上面加锁可以保证线程安全,但是因为只有在第一次初始化会出现不同步的问题,如果后面所有操作都要进行加锁操作,则系统性能大幅下降。
  • 如果采用双重检查锁,在一定条件下也会失效,详细参考《Java 并发编程艺术》。

Initialization Demand Holder(IoDH)

在需要实例化的单例类内引入一个静态内部类,当一次初始化实例时,由类加载器保证线程安全。既可以保证延迟加载,有可以保证线程安全,而且不影响系统性能。

//Initialization on Demand Holder
class Singleton {
private Singleton() {
} private static class HolderClass {
private final static Singleton instance = new Singleton();
} public static Singleton getInstance() {
return HolderClass.instance;
}
}

优点:

  • 提供了对唯一实例的受控访问,用户不能实例化单例类。
  • 节省系统资源,适用于一些频繁创建和销毁的对象。

缺点:

  • 没有定义抽象层,很难进行扩展。
  • 单例类职责过多,将单例的创建和本身功能融合在一起,一定程度上违反了“单一职责原则”。

适用场景:

  • 系统只需要一个实例对象,如序列生成器,资源管理器等。
  • 客户调用类的单个实例只允许使用一个公共访问点,除了该公共访问点,不能通过其他途径访问该实例。

实例:

SingletonPattern.java

六个创建模式之单例模式(Singleton Pattern)的更多相关文章

  1. "围观"设计模式(7)--创建型之单例模式(Singleton Pattern)

    单例模式,也叫单子模式,是一种经常使用的软件设计模式.在应用这个模式时,单例对象的类必须保证仅仅有一个实例存在. 很多时候整个系统仅仅须要拥有一个的全局对象.这样有利于我们协调系统总体的行为.比方在某 ...

  2. 【设计模式】单例模式 Singleton Pattern

    通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例(Instance)  的情况, 比如说我们想做一计数器,统计某些接口调用的次数,通常我们的数据库连接也是只期望有一个实例.Windo ...

  3. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

  4. 设计模式系列之单例模式(Singleton Pattern)——确保对象的唯一性

    模式概述 模式定义 模式结构图 饿汉式单例与懒汉式单例 饿汉式单例 懒汉式单例 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 适用场景 说明:设计模式系列文章是读刘伟所著 ...

  5. 浅谈设计模式--单例模式(Singleton Pattern)

    题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...

  6. 设计模式之单例模式(Singleton Pattern)

    单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...

  7. 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)

    原文:乐在其中设计模式(C#) - 单例模式(Singleton Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 单例模式(Singleton Pattern) 作者:weba ...

  8. 二十四种设计模式:单例模式(Singleton Pattern)

    单例模式(Singleton Pattern) 介绍保证一个类仅有一个实例,并提供一个访问它的全局访问点. 示例保证一个类仅有一个实例. Singleton using System; using S ...

  9. 设计模式01 创建型模式 - 单例模式(Singleton Pattern)

    参考 [1] 设计模式之:创建型设计模式(6种) | 博客园 [2] 单例模式的八种写法比较 | 博客园 单例模式(Singleton  Pattern) 确保一个类有且仅有一个实例,并且为客户提供一 ...

随机推荐

  1. android自定义RadioGroup实现可以添加多种布局

    android自带的RadioGroup是继承自LinearLayout,如果布局的时候不是直接写radiobutton,即radiobutton外面还包了一层容器,这时分组是不成功的,因为查找不到r ...

  2. 无线路由器WDS 桥接设置方法

    假设现在有a b c三台路由器,现在我们把b作为中心路由器,基本的配置之后使其能正常无线上网. 然后: 无线路由器A设置: 1.修改LAN口IP地址.在网络参数-LAN口设置中,修改IP地址和B路由器 ...

  3. 开发常用到的terminal命令

    1.删除work_plugin目录下的.svn文件(最后面的;也是命令的一部分) sudo find /Users/maxinliang/DaTang/work_plugin ".svn&q ...

  4. iOS开发- Xcode 7添加pch文件

    1.打开你的Xcode工程. 在Supporting Files目录下,选择 File > New > File > iOS > Other > PCH File 然后点 ...

  5. laravel 5.3 学习之路——路由(资源,别名)

    laravel的路由定义中,其中route:resoure(),可以直接定义类似restful风格的URL 例如:Route::resource('system/role','System\RoleC ...

  6. Android Matirx的简介

    在Android中,对图片的处理需要使用到Matrix类,Matrix是一个3 x 3的矩阵,他对图片的处理分为四个基本类型: 1.Translate————平移X,Y轴变换,而不是移动图形 2.Sc ...

  7. SplayTree伸展树的非递归实现(自底向上)

    Splay Tree 是二叉查找树的一种,它与平衡二叉树.红黑树不同的是,Splay Tree从不强制地保持自身的平衡,每当查找到某个节点n的时候,在返回节点n的同时,Splay Tree会将节点n旋 ...

  8. sqlserver -- 学习笔记(六)日期格式转换

    忘了这篇是从哪里看到,然后复制保存下来,感谢原创的分享~ ) ::08 ),'-',''),' ',''),':','') ),'/','-') ) , ) ) , ) ) , ) ) , ) ) , ...

  9. teamcity设置

    建立项目后首先要设置svn地址,并绑定 名字随便起 url是svn的地址 之后来做build step 有一个按钮可以自动检测,一般都能检测出来 执行这个似乎需要代理装什么东西 可以查看目前代理有那些 ...

  10. 使用 GistBox 轻松组织和管理你的代码片段

    GistBox 用简便的方式来组织和管理代码片段.你的代码会保存到云端进行备份,再也不用担心迷失在杂乱的代码片段中.GistBox 是建立在标准的 HTML5 技术基础上.在旅途中或在办公室,你都可以 ...