设计模式学习笔记:factory method(工厂方法)
3297 点击·0 回帖
![]() | ![]() | |
![]() | 工厂方法是一种对象创建型模式,它的目的是定义一个用于创建对象的接口,让子类决定实例化哪一个类,可以使一个类的实例化延迟到子类。 适用场景 工厂方法适用于一下几种情况: 1)当一个类不知道它所必须创建的对象的类的时候; 2)当一个类希望由它的子类来指定它所创建的对象的时候; 3)当类将创建对象的职责委托给多个帮助子类中的一个; 模式结构 下面我们来看一下工厂方法的模式结构以便对其有一个全局的了解,如图所示: ![]() 参与者 很显然,从上面的模式结构中我们可以看出工厂方法主要有4个主要参与者。 1)Product 定义工厂方法所创建对象的接口。 2)concreteProduct 实现对象创建的接口。 3)Creator 声明工厂方法以返回Product对象,也可以定义缺省的实现,返回一个缺省的ConcreteProduct对象,另外在Creator中也可以调用工厂方法以创建一个Product对象,稍后在代码中有体现,具体主要GetProduct()方法和CreateProduct()方法。 4)ConcreteCreator 重定义CreateProduct()方法返回一个具体的ConcreteProduct实例。 另外,Creator如果想创建一个具体的ConcreteProduct实例,则依赖于它的子类,如ConcreteCreator,这样就造成一个潜在的问题--可能仅为了创建适当的Product对象而被迫创建Creator类的子类,在C++中的一种解决方案是使用模板。 实现 下面通过代码实现上述工厂方法,类中具体的操作与上图有出入,主要为体现这种思想--延迟创建。 首先是各类的声明以及继承体系: [cpp] //factory.h #ifndef FACTORY_H #define FACTORY_H class Product { }; class Creator { public: Creator():m_pProduct(nullptr){}; Product* GetProduct(); virtual Product* CreateProduct()=0; private: Product *m_pProduct; }; /*针对上述潜在问题,这里提供一种解决方案 *1)提供一个Creator类的模板子类,用Product类作为模板参数 *2)这样做可以减少类的创建 */ template <class TheProduct> class StandardCreator:public Creator { public: virtual Product* CreateProduct(); }; template <typename TheProduct> Product* StandardCreator<TheProduct>::CreateProduct() { return new TheProduct(); } #endif //factory.h #ifndef FACTORY_H #define FACTORY_H class Product { }; class Creator { public: Creator():m_pProduct(nullptr){}; Product* GetProduct(); virtual Product* CreateProduct()=0; private: Product *m_pProduct; }; /*针对上述潜在问题,这里提供一种解决方案 *1)提供一个Creator类的模板子类,用Product类作为模板参数 *2)这样做可以减少类的创建 */ template <class TheProduct> class StandardCreator:public Creator { public: virtual Product* CreateProduct(); }; template <typename TheProduct> Product* StandardCreator<TheProduct>::CreateProduct() { return new TheProduct(); } #endif 然后是简单的实现: [cpp] //factory.cpp #include "factory.h" #include <iostream> using namespace std; Product* Creator::GetProduct() { if (nullptr == m_pProduct) { m_pProduct = CreateProduct(); } return m_pProduct; } //factory.cpp #include "factory.h" #include <iostream> using namespace std; Product* Creator::GetProduct() { if (nullptr == m_pProduct) { m_pProduct = CreateProduct(); } return m_pProduct; } 最后是测试代码: [cpp] //test.cpp #include "factory.h" #include <iostream> using namespace std; //客户只需提供不同的产品类,便可以使用统一的方法创建产品。 class MyProduct:public Product { public: MyProduct() { cout << "MyProduct has been constructed!" << endl; } }; class YourProduct:public Product { public: YourProduct() { cout << "YourProduct has been constructed!" << endl; } }; class OurProduct:public Product { public: OurProduct() { cout << "OurProduct has been constructed!" << endl; } }; int main() { StandardCreator<OurProduct> ourCreator; Product *pProduct = ourCreator.GetProduct(); StandardCreator<MyProduct> myCreator; pProduct = myCreator.GetProduct(); StandardCreator<YourProduct> yourCreator; pProduct = yourCreator.GetProduct(); char ch = getchar(); return 1; } //test.cpp #include "factory.h" #include <iostream> using namespace std; //客户只需提供不同的产品类,便可以使用统一的方法创建产品。 class MyProduct:public Product { public: MyProduct() { cout << "MyProduct has been constructed!" << endl; } }; class YourProduct:public Product { public: YourProduct() { cout << "YourProduct has been constructed!" << endl; } }; class OurProduct:public Product { public: OurProduct() { cout << "OurProduct has been constructed!" << endl; } }; int main() { StandardCreator<OurProduct> ourCreator; Product *pProduct = ourCreator.GetProduct(); StandardCreator<MyProduct> myCreator; pProduct = myCreator.GetProduct(); StandardCreator<YourProduct> yourCreator; pProduct = yourCreator.GetProduct(); char ch = getchar(); return 1; } 下面是测试效果:www.atcpu.com ![]() | |
![]() | ![]() |