`
flynewton
  • 浏览: 61843 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

探索设计模式--单例模式

阅读更多

关键字: 设计模式 , singleton , 单例

转自:http://www.iteye.com/topic/575052

各种构造模式之间可以互相比较,但是没有优劣好坏之分,只有确定了上下文环境,才能谈应用什么模式
学习设计模式我觉得也没有必要去强背一些代码模版,应当去理解每种模式的出现的原因和解决的问题
当你发现你的设计需要更大灵活性时,设计便会向着合适的模式演化,这时候你就真正的掌握了设计模式

 

目的:

希望对象只创建一个实例,并且提供一个全局的访问点。

场景:

Kerrigan对于Zerg来说是个至关重要的灵魂人物,无数的DroneZerglingHydralisk……可以被创造、被牺牲,但是Kerrigan得存在关系到Zerg在这局游戏中的生存,而且Kerrigan是不允许被多次创造的,必须有且只有一个虫族刀锋女王的实例存在,这不是游戏规则,但这是个政治问题。

分析:

如前面一样,我们还是尝试使用代码来描述访问Kerrigan的过程,看看下面的UML图,简单得我都不怎么好意思放上来占版面。

 

6.1 单例模式的UML

结构是简单的,只是我们还有一些小小的要求如下:

1.最基本要求:每次从getInstance()都能返回一个且唯一的一个Kerrigan对象。

2.稍微高一点的要求:Kerrigan很忙,很多人找,所以希望这个方法能适应多线程并发访问。

3.再提高一点的要求:Zerg是讲究公务员效率的社会,希望找Kerrigan的方法性能尽可能高。

4.最后一点要求是Kerrigan自己提出的:体谅到Kerrigan太累,希望多些睡觉时间,因此Kerrigan希望实现懒加载(Lazy Load),在需要的时候才被构造。

5.原本打算说还提要处理多ClassLoader、多JVM等情况,不过还是不要把情况考虑的太复杂了,暂且先放过作者吧(-_-#)。

 

我们第一次写的单例模式是下面这个样子的:

Java代码 
  1. /** 
  2.  * 实现单例访问Kerrigan的第一次尝试 
  3.  */  
  4. public class SingletonKerriganA {  
  5.    
  6.     /** 
  7.      * 单例对象实例 
  8.      */  
  9.     private static SingletonKerriganA instance = null;  
  10.    
  11.     public static SingletonKerriganA getInstance() {  
  12.         if (instance == null) {                              //line A  
  13.             instance = new SingletonKerriganA();          //line B  
  14.         }  
  15.         return instance;  
  16.     }  
  17. }  

 

 

这个写法我们把四点需求从上往下检测,发现第二点的时候就出了问题,假设这样的场景:两个线程并发调用SingletonKerriganA.getInstance(),假设线程一先判断完instance是否为null,既代码中的line A进入到line B的位置。刚刚判断完毕后,JVMCPU资源切换给线程二,由于线程一还没执行line B,所以instance仍然是空的,因此线程二执行了new SignletonKerriganA()操作。片刻之后,线程一被重新唤醒,它执行的仍然是new SignletonKerriganA()操作,好了,问题来了,两个Kerrigan谁是李逵谁是李鬼

紧接着,我们做单例模式的第二次尝试:

Java代码 
  1. /** 
  2.  * 实现单例访问Kerrigan的第二次尝试 
  3.  */  
  4. public class SingletonKerriganB {  
  5.    
  6.     /** 
  7.      * 单例对象实例 
  8.      */  
  9.     private static SingletonKerriganB instance = null;  
  10.    
  11.     public synchronized static SingletonKerriganB getInstance() {  
  12.         if (instance == null) {  
  13.             instance = new SingletonKerriganB();  
  14.         }  
  15.         return instance;  
  16.     }  
  17. }  

 

 

比起第一段代码仅仅在方法中多了一个synchronized修饰符,现在可以保证不会出线程问题了。但是这里有个很大(至少耗时比例上很大)的性能问题。除了第一次调用时是执行了SingletonKerriganB的构造函数之外,以后的每一次调用都是直接返回instance对象。返回对象这个操作耗时是很小的,绝大部分的耗时都用在synchronized修饰符的同步准备上,因此从性能上说很不划算。

那继续把代码改成下面的样子:

Java代码 
  1. /** 
  2.  * 实现单例访问Kerrigan的第三次尝试 
  3.  */  
  4. public class SingletonKerriganC {  
  5.    
  6.     /** 
  7.      * 单例对象实例 
  8.      */  
  9.     private static SingletonKerriganC instance = null;  
  10.    
  11.     public static SingletonKerriganC getInstance() {  
  12.         synchronized (SingletonKerriganC.class) {  
  13.             if (instance == null) {  
  14.                 instance = new SingletonKerriganC();  
  15.             }  
  16.         }  
  17.         return instance;  
  18.     }  
  19. }  

 

 

基本上,把synchronized移动到代码内部是没有什么意义的,每次调用getInstance()还是要进行同步。同步本身没有问题,但是我们只希望在第一次创建Kerrigan实例的时候进行同步,因此我们有了下面的写法——双重锁定检查(DCL)。

 

Java代码 
  1. /** 
  2.  * 实现单例访问Kerrigan的第四次尝试 
  3.  */  
  4. public class SingletonKerriganD {  
  5.    
  6.     /** 
  7.      * 单例对象实例 
  8.      */  
  9.     private static SingletonKerriganD instance = null;  
  10.    
  11.     public color: #7f0055; background-color: inherit; font-weight: b
    分享到:
    评论

相关推荐

    设计模式-Java语言中的应用(pdf)

    《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。...无论是初级开发者还是经验丰富的程序员,都应该不断探索和实践设计模式,以提升自己的专业技能。

    Python编程 -设计模式-从入门到实践

    在编程领域,设计模式是一种被广泛接受的解决常见问题的最佳实践。它们是经过时间验证的、可重用的解决方案,...在实践中不断探索和学习,你将发现设计模式的魅力和价值,它们是你编程生涯中不可或缺的工具和智慧结晶。

    《设计模式:可复用面向对象软件的基础》学习并理解 23 种设计模式

    - **单例模式**(Singleton):确保一个类只有一个实例,并提供一个全局访问点。 - **工厂方法模式**(Factory Method):定义一个创建对象的接口,但让子类决定实例化哪一个类。 - **抽象工厂模式**(Abstract ...

    设计模式--pdf文档

    设计模式是软件工程中的一种重要概念,它是在特定情境下,为解决常见问题而形成的一套最佳实践。这些模式经过时间的验证...无论你是初学者还是经验丰富的程序员,这套PDF文档都将是你探索设计模式世界的重要参考资料。

    深入探索Java中的单例模式:实现、应用与最佳实践

    在软件工程中,单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在Java中实现单例模式有多种方法,每种方法都有其特点和适用场景。本文将详细介绍几种常见的单例模式实现方式,并...

    设计模式 高清 完整版

    熟练掌握设计模式,意味着开发者能够在遇到相似问题时迅速定位到最佳实践,无需从零开始探索。 #### 设计模式的构成与分类 每个设计模式通常由以下几个关键部分组成: 1. **模式名称**:一个简洁且富有表现力的...

    软件秘籍--设计模式那点事随书光盘

    在探索这些设计模式的过程中,读者不仅需要理解模式的基本原理,还要学会如何根据实际情况选择合适的模式,并且要注意模式间的相互作用和权衡。此外,还需要关注设计原则,如开闭原则、依赖倒置原则、里氏替换原则、...

    侯捷2015设计模式课件-同济

    这次分享不仅覆盖了GoF的经典设计模式,还探索了GoF之外的一些设计模式,以及在C++和Java语言中的具体应用和实现。 首先,设计模式课件回顾了面向对象编程(Object-Oriented Programming,OOP)的基本原则,如封装...

    .net设计模式详细介绍以及案例代码

    .NET设计模式系列文章和随笔,如Terrylee的"探索设计模式"系列,提供了对.NET中常见设计模式的详细介绍和案例代码,对初学者和有经验的开发者都有很大的帮助。这类资源可以帮助开发者在.NET平台上更加高效地应用设计...

    java设计模式的 3本书 1 ppt

    设计模式是软件工程中的一种最佳实践,它提供了一套经过时间考验的解决方案,用来解决在设计可复用、可维护的...无论是初级开发者还是经验丰富的工程师,都应该不断探索和熟练运用设计模式,以实现更高质量的软件开发。

    深入探索c++对象模型 设计模式c++ pdf

    《深入探索C++对象模型》是一本深度剖析C++编程语言内部机制的著作,而设计模式则是软件工程中的一种最佳实践,是解决常见问题的模板。这两者结合在一起,为开发者提供了理解C++如何实现面向对象特性以及如何高效地...

    设计模式:可复用面向对象软件的基础.zip

    1. 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。这在需要控制资源管理或者需要全局唯一对象的场景中非常有用。 2. 工厂模式(Factory):提供一个接口用于创建对象,但让子类决定实例化哪一...

    《设计模式:可复用面向对象软件的基础》英文版

    包括抽象工厂模式(Abstract Factory)、建造者模式(Builder)、工厂方法模式(Factory Method)、原型模式(Prototype)和单例模式(Singleton)等。 - **结构型模式**:关注于类或对象的组合方式,使它们能形成更...

    设计模式迷你手册chm

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决问题的可重用解决方案。这个名为“设计模式迷你手册chm”的压缩包显然包含了关于设计模式的详细信息,...这个手册将是你在设计模式领域探索的宝贵资源。

    李建忠 C#面向对象设计模式纵横谈(25):设计模式总结

    在IT行业中,面向对象设计模式是软件开发中的重要概念,尤其在C#这样的面向对象编程语言中更是不可或缺。...无论是初学者还是经验丰富的开发者,都应该不断学习和探索设计模式,以实现更高效、更优雅的代码设计。

    head first 设计模式 PDF电子书下载

    总的来说,《Head First 设计模式》是一本值得反复研读的经典之作,它以直观易懂的方式引导读者探索设计模式的世界,无论你是初入编程殿堂的新手,还是经验丰富的开发者,都能从中受益匪浅。下载这本书的PDF版本,你...

    Java与模式-Java

    ### Java与模式-Java 关键知识点解析 #### 1. 设计原则与设计模式的重要性 - **背景介绍**:随着软件工程的发展,特别是在Java这样的面向对象编程语言中,设计原则和设计模式对于提高代码质量、增强系统的可维护性...

    java23种设计模式及其代码

    设计模式是软件工程中的一种最佳实践,它是在特定情境下为了解决常见问题而形成的一套可复用的解决方案。Java作为广泛应用的编程语言,其23种设计模式是每位专业...欢迎大家下载这份资料,一起探索Java设计模式的世界。

    设计模式 java 下载

    在IT行业中,设计模式是软件开发中的重要概念,它代表了在特定情境下解决常见问题的最佳实践。在Java编程语言中,理解并熟练运用设计模式是提升代码质量和可维护性的...所以,赶快下载并开始你的设计模式探索之旅吧!

    Gof设计模式双语版

    ### GOF23设计模式双语版解析 #### 引言 "GOF23设计模式双语版"是一份极具价值的学习资源,旨在帮助开发者...通过不断实践和探索,相信每位开发者都能够掌握并灵活运用这些设计模式,从而编写出更加优雅、高效的代码。

Global site tag (gtag.js) - Google Analytics