C言語でSingletonパターン【オブジェクト指向】

C言語でGoFのSigletonパターンを実装します。

Singletonパターンを確認する

まずはSingletonパターンを確認しましょう。TECHSCOREさんのSignletonパターンの解説記事をご参照ください。

 

https://www.techscore.com/tech/DesignPattern/Singleton.html/

 

Singletonパターンで設計する

TECHSCOREさんのサンプルコードをC言語に移植します。クラス図にすると次のようになります。

 

Singletonパターンのクラス図

 

Singletonパターンで実装する

RegisterNoteを作る

RegisterNoteを作ってみましょう。

まずはヘッダファイルです。今回は本の名前と貸出状態を保持する配列を持つようにしました。

 

RegisterNote.h

typedef enum BookName {
    BookName_JUMP,
    BookName_SUNDAY,
    BookName_CHAMPION,
    BookName_NAKAYOSHI,
    BookName_RIBON
} BookName;

typedef struct RegisterNote {
    BookName names[5];
    bool registered[5];
} RegisterNote;

extern RegisterNote *RegisterNote_getInstance();

 

ソースファイルは次のようになります。単一のインスタンスを保持するために、関数の外で宣言しています。初期値はNULLとしておきましょう。

getInstance()の初回読み出し時にインスタンスを初期化しています。2回目以降は作成したオブジェクトを毎回返します。

 

RegisterNote.c

RegisterNote *singleton = NULL;

RegisterNote *RegisterNote_getInstance() {
    if (singleton == NULL) {
        singleton = (RegisterNote*)malloc(sizeof(RegisterNote));
        for (uint16_t i = 0; i < 5; i++) {
            singleton->names[i] = i;
            singleton->registered[i] = false;
        }
    }

    return singleton;
}

 

目次:C言語でGoFのデザインパターン【オブジェクト指向】

ソースコード:https://github.com/yuksblog/c_gof_design_pattern