C言語でSingleton 2
前の記事 に続きC言語でSingletonをやってみます。
今度は使えそうな香りがするようなものになっていると思います。
今回も「Java言語で学ぶデザインパターン」が元ネタです。
簡単に言うと数字をカウントするオブジェクトをSingletonで実装するっていう課題です。
ではヘッダファイルから、
[singleton.h]
typedef struct {
/* int ticket; */
int (*getNextTicketNumber)();
} *Singleton;Singleton get_instance();
前回と違いSingletonの中身が構造体 (といってもintを返す関数へのポインタだけですが) になっています。
続いてSingleton、
[singleton.c]
#include <stdlib.h>
#include "singleton.h"static int ticket = 1000;
static Singleton singleton;static int inc()
{
return ticket++;
}Singleton get_instance()
{
if (!singleton) {
singleton = malloc(sizeof(*singleton));
singleton->getNextTicketNumber = inc;
}
return singleton;
}
ticketとinc()がstaticなのがポイントで、これらは他のファイルから呼ぶことができません。なので、ticketを直接アクセスすることはできず、get_instance()から得られるSingleton型の変数を通してしかアクセスできなくなります。
最後にメイン、
[main.c]
#include <stdio.h>
#include "singleton.h"int main()
{
int i;for (i = 0; i < 10; i++) {
printf("%d\n", get_instance()->getNextTicketNumber());
}return 0;
}
です。get_instance()->getNextTicketNumber()みたいな表記を試しにしてみたら特に異状なく動作しました(gcc4)。
実行結果は
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
です。こうやってカプセル化を実現するのはありかと思います。
| 固定リンク


コメント