赞
踩
1、意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到子类。
2、适用性
(1)当一个类不知道它所必须创建的对象的类的时候
(2)当一个类希望由它的子类来指定它所创建的对象的时候。
(3)当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
3、结构
UML类图表示为
4、参与者
Product:定义工厂方法所创建的对象的接口
ConcreteProduct:实现 Product接口
Creator:声明工厂,该方法返回一个Product类型的对象;可以调用工厂方法创建一个Product对象
ConcreteCreator:重定义工厂方法返回一个Concrete实例对象。
5、协作
Creator依赖于它的子类来定义工厂方法,所以它返回一个适当的ConcreteProduct实例。
其序列图表示为
6、效果
工厂方法不再将与特定应用有关的类绑定到你的代码中,仅处理Product接口。
缺点是仅仅为了创建一个特定的ConcreteProduct对象,就要创建ConcreteCreator子类。
c++样例代码
- #include <iostream>
- #include <string>
- #include <memory>
-
- using namespace std;
-
- enum class ProductType
- {
- PRODUCT1,
- PRODUCT2
- };
-
- class Product
- {
- public:
- virtual void method() = 0;
- };
-
-
- class Product1 : public Product
- {
- public:
- void method() {cout << "Product1:method()" << endl;}
- };
-
- class Product2 : public Product
- {
- public:
- void method() {cout << "Product2:method()" << endl;}
- };
-
-
- class Creator
- {
- protected:
- virtual unique_ptr<Product> factoryMethod(ProductType type) = 0;
- public:
- void opration()
- {
- ProductType productType[] = {ProductType::PRODUCT1, ProductType::PRODUCT2};
-
- for (auto x : productType) {
- unique_ptr<Product> product = factoryMethod(x);
- product->method();
- }
- }
- };
-
-
- class ConcreteCreator : public Creator
- {
- public:
- unique_ptr<Product> factoryMethod(ProductType type)
- {
- unique_ptr<Product> ret(nullptr);
-
- switch (type) {
- case ProductType::PRODUCT1:
- ret.reset(new Product1);
- break;
- case ProductType::PRODUCT2:
- ret.reset(new Product2);
- break;
- default:
- break;
- }
-
- return ret;
- }
- };
-
- int main()
- {
- ConcreteCreator cr;
- cr.opration();
-
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。