知识大全 Singleton模式

Posted

篇首语:天才就是百分之九十九的汗水加百分之一的灵感本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Singleton模式相关的知识,希望对你有一定的参考价值。

最简单的设计模式学习:Singleton模式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  学习设计模式 自然从最简单的模式入手 而最简单的模式便是Singleton 所以第一篇就来所以说Singleton模式 看完GOF和Design patterns in Java的书 感觉Singleton虽然简单 但是想写出一个好的Singleton也不是一上来就能写出来的

  Singleton模式的用处自然是保证一个类只有一个唯一的实例 在建模中涉及到的只能有一个对象 例如Struts中的Action类就是一例 除此之外 Singleton还使得该对象只有一个全局访问点 这就是SIngleton的作用

  说得比较抽象 我们来看一个简单Singleton的C++和Java的代码

  C++ Singleton模式

  类定义

   class Singleton

  

   public:

       static Singleton * Instance();

       ~Singleton();

  

   private:

       Singleton();

  

       static Singleton * instance;

   ;

  方法实现

   Singleton * Singleton::instance = ;

  

   Singleton::Singleton()

  

  

  

  

   Singleton::~Singleton()

  

  

  

  

   Singleton * Singleton::Instance()

  

       if (instance == )

           instance = new Singleton();

      

  

       return instance;

  

  Java Singleton模式

   public class Singleton

  

       private static Singleton instance;

  

       public static Singleton getInstance()

           if (instance == null)

               instance = new Singleton();

  

           return instance;

      

  

       /** *//** Creates a new instance of Singleton */

       private Singleton()

      

  

  通过上面的例子可以看出 Singleton的实现并不难 只要将构造函数访问域设为私有 然后添加一个静态引用和一个获得该应用的静态方法即可 其实在C++中定义一个全局静态变量也可以达到这个效果 但是像Java这样的语言就是能使用Singleton了

  上面的程序有一个问题 就是只能运行在单线程的环境下 为此我在C++上作了个实验 首先#include 在SIngleton::Instance()函数中增加一个Sleep( ) 程序如下

   Singleton * Singleton::Instance()

  

       if (instance == )

           Sleep( );

           instance = new Singleton();

      

  

       return instance;

  

  然后在主函数中创建两个线程 程序如下

   static Singleton * s = * s = ;

  

   DWORD WINAPI ThreadProc (PVOID)

  

       s = Singleton::Instance();

  

       return ;

  

  

   DWORD WINAPI ThreadProc (PVOID)

  

       s = Singleton::Instance();

  

       return ;

  

  

   int main(int argc char* argv[])

  

       DWORD threadID ;

       DWORD threadID ;

  

       CreateThread(NULL ThreadProc NULL &threadID );

       CreateThread(NULL ThreadProc NULL &threadID );

  

       Sleep( );

  

       std::cout << s << << s ;

  

       return ;

  

  这样修改后在运行程序 打印出来的s 和s 地址就不是同一个地址了 结果如下

   D E Press any key to continue

  可见当在多线程环境下使用这个Singleton就会出现创建不止一个实力的情况 所以我们需要给Singleton加锁 请看下面的代码

  C++ Singleton模式

   class Singleton

  

   public:

       static Singleton * Instance();

       virtual ~Singleton();

  

   private:

       Singleton();

  

       static CMutex mutex;

       static Singleton * instance;

   ;

   Singleton * Singleton::instance = ;

   CMutex Singleton::mutex;

  

   Singleton::Singleton()

  

  

  

  

   Singleton::~Singleton()

  

  

  

  

   Singleton * Singleton::Instance()

  

       mutex Lock();

  

       if (instance == )

           Sleep( );

           instance = new Singleton();

      

  

       mutex Unlock();

  

       return instance;

  

  此外需要#include < afxmt h> 并且在项目设置中要设置动态链接MFC库

  Java Singleton模式

   public class Singleton

  

       private static Singleton instance;

       private static Object lock = Singleton class;

  

       public static Singleton getInstance()

           synchronized (lock)

               if (instance == null)

                   instance = new Singleton();

  

               return instance;

          

      

  

       /** *//** Creates a new instance of Singleton */

       private Singleton()

      

  

cha138/Article/program/Java/gj/201311/27446

相关参考

知识大全 单件模式singleton的理解

  Singleton模式是一个较为简单的模式下面的代码就可以建立一个Singlton模式的例子这是一个写系统日志的类实际应用的意义在于在内存中只保存一个实例避免开辟多个功能相同的工具类实例而耗用系统

知识大全 .Net 单例模式(Singleton)

.Net单例模式(Singleton)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!单例模式的意思

知识大全 Singleton设计模式的C#实现

Singleton设计模式的C#实现  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!Singleto

知识大全 C# “Singleton” 模式四种实现方法

C#“Singleton”模式四种实现方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  大家一

知识大全 在Java中应用设计模式Singleton

在Java中应用设计模式Singleton  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &nb

知识大全 在Java中应用设计模式之Singleton

在Java中应用设计模式之Singleton  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  基本

知识大全 23种设计模式的Java版--Singleton(单例)

23种设计模式的Java版--Singleton(单例)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 从C#的Singleton设计模式实现看.NETFramework特性对开发者的重要性

从C#的Singleton设计模式实现看.NETFramework特性对开发者的重要性  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布

知识大全 php设计模式之单例、多例设计模式的应用分析

本篇文章是对php设计模式中的单例与多例设计模式的应用进行了详细的分析介绍需要的朋友参考下   单例(Singleton)模式和不常见的多例(Multiton)模式控制着应用程序中类的数量如

知识大全 Spring Singleton的陷阱介绍

SpringSingleton的陷阱介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  这是一个