場景:序列生成器
系統中統一的序列生成程式,整個系統統一一套!那麼就用單例模式吧!
首先看看單例模式
1)類持有乙個自己的例項,而且還是個靜態例項。
2)類的建構函式為私有屬性。
3)用以獲得例項的方法為靜態方法。
看看類圖
//構造方法實現
singleton::singleton()
void singleton::setvar(int var)
int main(int argc, char* ar**)
return instance;
} 上面的函式,就是通過instance來實現單例的。
當第一次呼叫getinstance時,instance 為null,所以會執行
instance = new singleton();
把這個新建的例項儲存到靜態成員instance,並返回這個指標。
第二次到第n次呼叫getinstance時,由於instance不為空,所以會直接返回instance 。也就是第一次呼叫getinstance建立的那個例項。
所以這樣就實現了,單例項。
意思就是說,singleton物件的例項,只會被建立一次,就是說記憶體中,只存在乙個singleton的例項,就是所謂,單例項。
弄個生成單例的例項程式吧!
#include #include #include #include #include #include #include #include #include using namespace std;
#define maxid 9999
static struct sembuf op_open=;
class genhh
genhh::~genhh()}
//初始化靜態成員
genhh* genhh::instance=null;
genhh* genhh::getinstance()
return instance; }
unsigned int genhh::gen_hh()
unsigned int genhh::gen_seq()
semctl_arg;
kid=ftok("/etc/hosts",'m');
if(kid<0)
semid=opensem(kid);
if(semid<=0) }
semval=semctl(semid,1,getval,0);
if(semval<=2) }
sem_open(semid);
semval=semctl(semid,1,getval,0);
return maxid-semval;}
int genhh::opensem(key_t semkey)
return semid;}
int genhh::creatsem(key_t semkey,int bigcount)
semctl_arg;
semid=semget(semkey,2,ipc_creat|0600);
if(semid<0)
if((semval=semctl(semid,1,getval,0))<0)
printf("getval error!\n");
else if(semval==0)
return semid;}
int genhh::sem_open(int semid)
printf("sem op_open error!\n");
return -1;
} return 0;}
int main(int argc, char* ar**)
設計模式之 生成器模式
在產品結構比較複雜,構造過程比較繁瑣,一次性構造比較難的時候,我們可以採取分而治之的原則,將產品元件化,每個元件由專門的廠商來生產,最後的產品指派給制定的車間進行最後裝配.這種方式其實是現代製造業的一種典型的模式.比如汽車,飛機的製造等.這樣做的好處是 1.產品的部件由專門的生產廠商來生產,這樣分工...
設計模式之 生成器模式
在產品結構比較複雜,構造過程比較繁瑣,一次性構造比較難的時候,我們可以採取分而治之的原則,將產品元件化,每個元件由專門的廠商來生產,最後的產品指派給制定的車間進行最後裝配.這種方式其實是現代製造業的一種典型的模式.比如汽車,飛機的製造等.這樣做的好處是 1.產品的部件由專門的生產廠商來生產,這樣分工...
設計模式之 生成器模式
在產品結構比較複雜,構造過程比較繁瑣,一次性構造比較難的時候,我們可以採取分而治之的原則,將產品元件化,每個元件由專門的廠商來生產,最後的產品指派給制定的車間進行最後裝配.這種方式其實是現代製造業的一種典型的模式.比如汽車,飛機的製造等.這樣做的好處是 1.產品的部件由專門的生產廠商來生產,這樣分工...