唯一のインスタンスを提供するクラス。 public継承をして使う。 使い方を正しくしないと、Singletonにならない罠があるので注意。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
- - | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - | | | - | | ! | | | | | - ! | - ! | | ! | | !
/** * @file * デザインパターンSingletonインターフェースを記述する。 */ #pragma once //----------------------------------------------------------- namespace apcl { namespace interface { /** * デザインパターンSingletonインターフェース。 * <pre> * 正確なsingletonではないのであしからず。 * public継承して使う。 * 継承するクラスはデフォルトコンストラクタを持つ必要がある。 * インスタンスにアクセスする場合、クラス名::instance()でアクセスする。 * Singletonを継承したクラスを継承するのは推奨しない。 * * 例:正確でないSingleton * @code * class A : public ::apcl::interface::Singleton<A> * { * public: * void print(); * }; * * void func() * { * A::instance().print(); * } * @endcode * * 例:正確なSingleton * @code * class A : public ::apcl::interface::Singleton<A> * { * friend ::apcl::interface::Singleton<A>; * public: * void print(); * private: * A(); * }; * * void func() * { * A::instance().print(); * } * @endcode * * </pre> */ template< typename T > class Singleton { public: /// インスタンスを取得する。 static T& instance() { static T instance_; return instance_; } protected: /// 生成・破棄 //@{ Singleton() { } virtual ~Singleton() { } //@} }; }} // end of namespace ::apcl::interface //----------------------------------------------------------- // EOF
1 2 3 4 5 6 7 8
/** * @file * Singleton.hppの実装を記述する。 */ #include <apcl/interface/Singleton.hpp> //----------------------------------------------------------- // EOF