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

2007年6月17日 (日)

C言語でSingleton

Java言語で学ぶデザインパターンを参考にやってみた。

まずはヘッダファイル。
singleton.h

typedef int *Singleton;

Singleton get_instance();

Singletonという型を宣言。実際に利用するときはint *ではなくなる可能性が高い。
get_instance()でオブジェクトを取得する。

続いてsingeton自体となるファイル。
singleton.c

#include <stdlib.h>
#include "singleton.h"

static Singleton singleton;

Singleton get_instance()
{
    /* ロックする */
    if (!singleton) {
        singleton = malloc(sizeof(*singleton));
    }
    /* ロック解除 */
    return singleton;
}

singletonの宣言にstaticを付けることで、外部のファイルからアクセスできなくする。
get_instanceではそれで領域がとれていなかったらとるようにして、singletonを返す。
スレッドの事とかを考慮して、ロックを掛ける必要がでてくる事も出てくるかもしれない。

最後に利用するファイル。
main.c

#include <stdio.h>
#include "singleton.h"

int main()
{
    Singleton obj1;
    Singleton obj2;

    printf("Start.\n");
    obj1 = get_instance();
    obj2 = get_instance();
    if (obj1 == obj2) {
        printf("obj1とobj2は同じインスタンスです。\n");
    }
    else {
        printf("obj1とobj2は同じインスタンスではありません。\n");
    }
    printf("End.\n");

    return 0;
}

実行結果は

Start.
obj1とobj2は同じインスタンスです。
End.

一応意図どおりできました。
ただ、mainの方で、
Singleton s;
s = malloc(sizeof(*s));
みたいな事は防げないので、厳密にはSingletonではないのだろうな。
あとfreeしてないのも問題か

|

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

コメント

コメントを書く



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




トラックバック

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

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

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