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;
}