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

- Java版
- C++版
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…
}
}
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了一個物件。