您现在的位置是:首页 >

最简单的设计模式学习:Singleton模式

火烧 2021-05-04 20:48:03 1062
最简单的设计模式学习:Si gleto 模式   学习设计模式 自然从最简单的模式入手 而最简单的模式便是Si gleto 所以第一篇就来所以说Si gleto 模式 看完GOF和De ig atte

最简单的设计模式学习:Singleton模式  

  学习设计模式 自然从最简单的模式入手 而最简单的模式便是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 * 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() {

       }

   }

lishixinzhi/Article/program/Java/gj/201311/27446  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码