補足です。
1.初期化されていない時点で初期化不可能な場所から呼ばれるケースは(コードでは)現状無視するか例外で結構です。
2.一度初期化されている場合は変数が異なっていても追加の初期化指示は無視してかまいません。
3.> そもそもの設計がダメな気がしています。
回答しやすくなるかと思い書いた条件が裏目に出ているかもしれません。
質問の主旨は、引数つきで生成するインスタンスをシングルトンで扱いたい場合、なにかパターンのようなものがあるかどうか知りたい、というものでした。
特に、インスタンス取得と初期化を同じ入口で行う方法があるか、分けなければいけないとしても綺麗な実装方法はあるか、というのが主に知りたい部分です。
なので上の条件は一部無視してでも一般的な情報があればそれは助かります。(具体的な問題を解決するデザインパターンにこだわっているわけではありません)
質問が解りづらくて申し訳ありません。
よろしくお願い致します。
▽1
●
a-kuma3 ●100ポイント ベストアンサー |
面白そうなので、ちょっと考えてみました。
こんな感じで、どうでしょう?
class TestSingleton { public: static TestSingleton* getInstance(const Parameter* param) { if (instance_ == not_initialized_) { if (param != NULL) { instance_ = new TestSingleton(param); } } return instance_; } virtual void method1() { ... } private: TestSingleton(const Parameter* param) { ... } TestSingleton() {} private: static TestSingleton* instance_; static TestSingleton* not_initialized_; // 初期化されていないインスタンス用のクラス class NotInitialized : public TestSingleton { // 全てのメソッドで、例外を送出する virtual void method1() { throw NotInitializedException(); } }; }; TestSingleton* TestSingleton::not_initialized_ = new TestSingleton::NotInitialized(); TestSingleton* TestSingleton::instance_ = not_initialized_;
同期とか、コピーコンストラクタとか、その辺りの Singleton のテンプレートは割愛してます。
スコープもちょっと怪しいけど、大目に見てください。
んで、使う側はこう。
// 初期化できる人 Parameter param = ... TestSingleton s = TestSingleton::getInstance(¶m); // 初期化できない人 TestSingleton s = TestSingleton::getInstance(NULL);
たたき台にでもなれば。
# 叩くときは、優しくお願いします :-)