1 // テンプレートパラメータとして渡された型を生成するための
4 // Factoryは、単純に渡された型を生成して返すためだけのクラス
5 // です。InheritFactoryは、ある型の派生クラスを生成するための
7 // PermutationFactoryは、InheritFactoryを利用して、Factory置換を
11 // Hoge* p = o.Create();
12 // InheritFactory<Hoge, Hoge2> o2();
13 // Hoge2* p2 = o2.Create();
16 // PermutationFactory<Hoge, Hoge2> pf;
18 // pf.ReplaceFactory(Hoge3()); // Hoge3 is inherit from Hoge
19 // p = pf.Create(); // Create `Hoge3` Instance!
20 #ifndef _HOME_DERUI_DEVELOP_UTAKATA_LIB_FACTORY_H_
21 #define _HOME_DERUI_DEVELOP_UTAKATA_LIB_FACTORY_H_
23 #include "lib/uncopyable.h"
24 #include "lib/scoped_ptr.h"
29 class Factory : private utility::Uncopyable {
30 // テンプレートパラメータで渡された型を新規に生成して
32 // 生成は全てnewで行われるため、このクラスから生成したインスタンス
33 // については、利用する側に解体責任が発生します。
37 // テンプレートで渡された型を新規に生成します。
38 virtual T* Create() const {reutrn new T;}
41 template<class T, class S>
42 class InheritFactory : public Factory<T> : private utility::Uncopyable {
43 // テンプレートパラメータ`S`で渡された型を新規に生成して
45 // 生成は全てnewで行われるため、このクラスから生成したインスタンス
46 // については、利用する側に解体責任が発生します。
47 // テンプレートパラメータ`S`は、テンプレートパラメータ`T`の
56 * @brief クラス置換を擬似的に実現するためのテンプレート
57 * このクラスでは、SはTの派生クラスとして、Sを切り替えてnewすることが
60 template<class T, class S>
61 class PermutationFactory {
64 PermutationFactory() : factory_(new InheritFactory(T, S)) {}
66 * @brief 基底の型へのポインタを返す。
68 T* Create() {return factory_->Creater();}
71 * @brief 基本型のfactoryを返すが、これは実際には派生型を返すものである。
73 smart_ptr<Factory<T> > factory() const {
78 * @brief factoryの置換を行う。
79 * 置換を行うことが出来るのは、UがTの派生型であるときだけである。
82 void ReplaceFactory(U p) {factory_.reset(new InheritFactory(T, U));}
86 scoped_ptr<Factory<T> > factory_;
88 }; // end of namespace utility
90 #endif /* _C:_MEADOW_DEVELOP_UTAKATA_LIB_FACTORY_H_ */