C言語でGoFのSigletonパターンを実装します。
Singletonパターンを確認する
まずはSingletonパターンを確認しましょう。TECHSCOREさんのSignletonパターンの解説記事をご参照ください。
https://www.techscore.com/tech/DesignPattern/Singleton.html/
Singletonパターンで設計する
TECHSCOREさんのサンプルコードをC言語に移植します。クラス図にすると次のようになります。
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; }