2011年11月25日 星期五

Singleton

http://my.so-net.net.tw/idealist/Patterns/Singleton.html



Singleton
(史帝芬, idealist@gcn.net.tw, 2003/10/21)
當系統中某項資源只有一個,而且絕對獨一無二時,最適合使用這個Pattern,也就是說使用這個Pattern可以確保 物件個體只有一個,不會因programmer的疏忽而產生兩個或兩個以上。
  同一個Pattern,用不同的語言實作會因語言本身的特性與限制而有些許的不同,這裡會展現Java和C++兩種版本。
  • Java版

  • Singleton.java
    public class Singleton {
     private static Singleton singleton = new Singleton();
     private Singleton() {
      System.out.println("已產生物件個體");
     }

     public static Singleton getInstance() {
      return singleton;
     }
    }

    說明: 注意看上面的建構式,是private ! 也就是說用 new Singleton也出現編譯錯誤,如此就可以防止人為疏失,那麼這 個class要怎麼使用呢? 方法如下…
    public class Main {
     public static void main(String[] args) {
      Singleton obj1 = Singleton.getInstance();
      //do something…
     }
    }

  • C++版

  • Singleton.h
    class Singleton {
    private:
     static Singleton* singleton;
     int count;
     Singleton();
    public:
     static Singleton* getInstance();
     void setCount(int c);
     int getCount();
    };

    Singleton.cpp
    #include "Singleton.h"

    Singleton* Singleton::singleton = 0;

    Singleton::Singleton() { }

    Singleton* Singleton::getInstance()
    {
     if (singleton == 0) {
      singleton = new Singleton;
     }
     return singleton;
    }

    void Singleton::setCount(int c)
    {
     count = c;
    }

    int Singleton::getCount()
    {
     return count;
    }

    main.cpp (使用範例)
    #include "Singleton.h"
    #include "stdio.h"

    int main() {
     Singleton* singleton1 = Singleton::getInstance();
     Singleton* singleton2 = Singleton::getInstance();
     singleton1->setCount(100);
     printf("singleton2->count: %d\n", singleton2->getCount());
     singleton2->setCount(200);
     printf("singleton1->count: %d\n", singleton1->getCount());

     return 1;
    }

    執行結果
    singleton2->count: 100
    singleton1->count: 200

    說明:
    有人或許會想,寫個普通的class,然後設一全域變數不就行了? 這個想法有缺點! 因為你沒辦法 預防其它人又new了一個物件。

沒有留言:

張貼留言