設計模式 4 序列生成器之單例模式

2021-09-23 21:41:48 字數 2014 閱讀 1510

場景:序列生成器

系統中統一的序列生成程式,整個系統統一一套!那麼就用單例模式吧!

首先看看單例模式

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.產品的部件由專門的生產廠商來生產,這樣分工...