设计模式-单例模式(singleton pattern)

来源:互联网 发布:淘宝今天怎么打不开 编辑:程序博客网 时间:2024/05/01 19:04

单例模式定义:确保一个类只有一个实例,并提供全局访问点.    应用场景:<head first>书中介绍有  线程池  缓存  对话框  注册表 日志 打印机驱动程序的对象等   个人在android开发中 使用到的场景是: 应用主界面加底部导航栏切换 中间内容的fragment时  将fragment 为单例的   不知道大家是如果去实现相应需求的  欢迎大家一起交流. 

注意:

双重检查加锁 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