« C言語でSingleton | トップページ | C言語でIterator »

2007年6月20日 (水)

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

です。こうやってカプセル化を実現するのはありかと思います。

|

« C言語でSingleton | トップページ | C言語でIterator »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/126478/15495726

この記事へのトラックバック一覧です: C言語でSingleton 2:

« C言語でSingleton | トップページ | C言語でIterator »