/** * @file * デザインパターンSingletonインターフェースを記述する。 */ #pragma once //----------------------------------------------------------- namespace apcl { namespace interface { /** * デザインパターンSingletonインターフェース。 *
   * 正確なsingletonではないのであしからず。
   * public継承して使う。
   * 継承するクラスはデフォルトコンストラクタを持つ必要がある。
   * インスタンスにアクセスする場合、クラス名::instance()でアクセスする。
   * Singletonを継承したクラスを継承するのは推奨しない。
   *
   * 例:正確でないSingleton
   * @code
   * class A : public ::apcl::interface::Singleton
   * {
   * public:
   *   void print();
   * };
   *
   * void func()
   * {
   *  A::instance().print();
   * }
   * @endcode
   *
   * 例:正確なSingleton
   * @code
   * class A : public ::apcl::interface::Singleton
   * {
   *   friend ::apcl::interface::Singleton;
   * public:
   *   void print();
   * private:
   *   A();
   * };
   *
   * void func()
   * {
   *  A::instance().print();
   * }
   * @endcode
   *
   * 
*/ template< typename T > class Singleton { public: /// インスタンスを取得する。 static T& instance() { static T instance_; return instance_; } protected: /// 生成・破棄 //@{ Singleton() { } virtual ~Singleton() { } //@} }; }} // end of namespace ::apcl::interface //----------------------------------------------------------- // EOF