设计模式-单例模式(singleton pattern)
来源:互联网 发布:淘宝今天怎么打不开 编辑:程序博客网 时间:2024/05/01 19:04
单例模式定义:确保一个类只有一个实例,并提供全局访问点. 应用场景:<head first>书中介绍有 线程池 缓存 对话框 注册表 日志 打印机驱动程序的对象等 个人在android开发中 使用到的场景是: 应用主界面加底部导航栏切换 中间内容的fragment时 将fragment 为单例的 不知道大家是如果去实现相应需求的 欢迎大家一起交流.
2.饿汉式:类一加载就实例话一个对象 最简单的方式 特点:节省时间 (getInstance() 时不用再new ) 占用空间(不管你需不需要 在类加载时就创建) 无线程安全问题
注意:
双重检查加锁 volatile 关键字 <span style="color: rgb(51, 51, 51); font-family: arial, 宋体, sans-serif; font-size: 14px; line-height: 24px; text-indent: 28px;">如果没有volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么</span><a target=_blank target="_blank" href="http://baike.baidu.com/view/487018.htm" style="text-decoration: none; color: rgb(19, 110, 194); font-family: arial, 宋体, sans-serif; font-size: 14px; line-height: 24px; text-indent: 28px;">编译器</a><span style="color: rgb(51, 51, 51); font-family: arial, 宋体, sans-serif; font-size: 14px; line-height: 24px; text-indent: 28px;">失去大量优化的机会-百度百科</span>
<span style="color: rgb(51, 51, 51); font-family: arial, 宋体, sans-serif; font-size: 14px; line-height: 24px; text-indent: 28px;">对于这个关键字详细的大家可以百度百科一下</span>
单例模式有三种形式:1.懒汉式 2.饿汉式3.双重检查加锁(double-checked locking)
1.懒汉式:当需要的时候才去实例化对象 通过同步getInstance() 避免了多线程安全问题 缺点 每次getInstance() 都要判断一下 而且同步效率低下 ps:<head first>书中说到"同步一个方法可能造成程序执行效率下降100倍" 在不频繁使用getInstance() 或不考虑效率的情况下 使用
例:
<pre name="code" class="html">public class <span style="font-family: Arial, Helvetica, sans-serif;">singeton</span><span style="font-family: Arial, Helvetica, sans-serif;"> </span><span style="font-family: Arial, Helvetica, sans-serif;">{</span><span style="white-space:pre"></span> private <span style="font-family: Arial, Helvetica, sans-serif;">singeton</span><span style="font-family: Arial, Helvetica, sans-serif;"> </span><span style="font-family: Arial, Helvetica, sans-serif;">(){}//私有化构造方法 保重类外部不能使用new创建对象</span> <span style="white-space:pre"></span> private static <span style="font-family: Arial, Helvetica, sans-serif;">singeton</span><span style="font-family: Arial, Helvetica, sans-serif;"> instance;//全局唯一的一个实例引用</span> <span style="white-space:pre"></span> public static synchronized <span style="font-family: Arial, Helvetica, sans-serif;">singeton </span><span style="font-family: Arial, Helvetica, sans-serif;">getInstance(){</span> <span style="white-space:pre"></span> <span style="white-space:pre"></span>if(instance == null){<span style="white-space:pre"></span>instance = new <span style="font-family: Arial, Helvetica, sans-serif;">singeton</span><span style="font-family: Arial, Helvetica, sans-serif;">();</span><span style="white-space:pre"></span>} <span style="white-space:pre"></span> return instance;<span style="white-space:pre"></span>}}
2.饿汉式:类一加载就实例话一个对象 最简单的方式 特点:节省时间 (getInstance() 时不用再new ) 占用空间(不管你需不需要 在类加载时就创建) 无线程安全问题
public class singeton{<span style="white-space:pre"></span>private singeton(){}<span style="white-space:pre"></span>private volatile Singeton instance = new Singeton();<span style="white-space:pre"></span>public static Singleton getInstance(){<span style="white-space:pre"></span>return instance;<span style="white-space:pre"></span>}}
3.双重检查加锁 同懒汉式一样 都在需要时才创建对象 并且也有线程安全问题 只是做法不同 相比懒汉式 性能要高 因为不必每次都执行同步方法 如果jdk低于1.5请不要使用这种实现方法
public class singeton{<span></span>private singeton(){}<span></span>private Singeton instance;<span></span>public static Singleton getInstance(){
<span style="white-space:pre"></span>if(instance==null){//如果不为空就直接返回 避免懒汉式的每一次getInstance()都执行同步方法 提高性能
<span style="white-space:pre"></span><span style="font-family: Arial, Helvetica, sans-serif;">synchronized (Singleton.class){//如果为空了在进行同步 确保线程安全</span>
<span style="white-space:pre"></span>if(instance==null){//为什么要再次判断? 因为如果不再次判断的话 有可能出现 下面代码被执行多次的情况
<span style="white-space:pre"></span>instance=new Singleton();
<span style="white-space:pre"></span>}
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"></span>}</span>
</pre><pre name="code" class="java"><span style="white-space:pre"></span>}<span></span>return instance;<span></span>}}
新手学习设计模式总结,希望大家一起交流学习进步. 个人看的是<head first - 设计模式>(java版) 这本书 感觉挺有意思,很生动.
0 0
- 设计模式 - Singleton Pattern(单例模式)
- 设计模式 - Singleton Pattern(单例模式)
- 设计模式-单例模式(Singleton Pattern)
- 设计模式 -- 单例模式 Singleton Pattern
- 设计模式-单例模式(singleton pattern)
- 设计模式--单例模式【Singleton Pattern】
- 设计模式 单例模式(Singleton Pattern)
- 【设计模式】Singleton Pattern 单例模式
- 设计模式--单例模式(Singleton Pattern)
- 设计模式【单例模式Singleton Pattern】
- 设计模式(design pattern)-单例模式(singleton pattern)
- 设计模式---单例设计模式(Singleton Pattern)
- 设计模式之单模式 Singleton pattern
- 设计模式-单件模式(Singleton Pattern)
- Delphi设计模式之单例模式(Singleton Pattern)
- AS3设计模式之一:单例模式(Singleton Pattern)
- 设计模式4:Singleton Pattern (单例模式)
- 乐在其中设计模式(C#) - 单例模式(Singleton Pattern)
- Red5的直播与点播的压力测试(并发数的测试)
- 使控件背景透明化
- python adaboost 自适应数据加载函数
- JDeveloper设置代码提示(代码助手)和代码美化
- java基础---final、finally、finalize
- 设计模式-单例模式(singleton pattern)
- UITableViewCell系统自带的四种样式
- 重建控制文件的原则:原有的控制文件一定要mv走
- ArrayAdapter学习
- LightOJ1027---A Dangerous Maze (期望)
- GUI框架
- Android Studio Rendering Problems
- JSP自定义标签
- AllJoyn教程 - AllJoyn基本组件概念