当前位置:   article > 正文

创建型模式之FactoryMethod_定义一个用于创建对象的接口,让子类决定实例化哪一个类。factory method 使一个类

定义一个用于创建对象的接口,让子类决定实例化哪一个类。factory method 使一个类

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++样例代码

  1. #include <iostream>
  2. #include <string>
  3. #include <memory>
  4. using namespace std;
  5. enum class ProductType
  6. {
  7. PRODUCT1,
  8. PRODUCT2
  9. };
  10. class Product
  11. {
  12. public:
  13. virtual void method() = 0;
  14. };
  15. class Product1 : public Product
  16. {
  17. public:
  18. void method() {cout << "Product1:method()" << endl;}
  19. };
  20. class Product2 : public Product
  21. {
  22. public:
  23. void method() {cout << "Product2:method()" << endl;}
  24. };
  25. class Creator
  26. {
  27. protected:
  28. virtual unique_ptr<Product> factoryMethod(ProductType type) = 0;
  29. public:
  30. void opration()
  31. {
  32. ProductType productType[] = {ProductType::PRODUCT1, ProductType::PRODUCT2};
  33. for (auto x : productType) {
  34. unique_ptr<Product> product = factoryMethod(x);
  35. product->method();
  36. }
  37. }
  38. };
  39. class ConcreteCreator : public Creator
  40. {
  41. public:
  42. unique_ptr<Product> factoryMethod(ProductType type)
  43. {
  44. unique_ptr<Product> ret(nullptr);
  45. switch (type) {
  46. case ProductType::PRODUCT1:
  47. ret.reset(new Product1);
  48. break;
  49. case ProductType::PRODUCT2:
  50. ret.reset(new Product2);
  51. break;
  52. default:
  53. break;
  54. }
  55. return ret;
  56. }
  57. };
  58. int main()
  59. {
  60. ConcreteCreator cr;
  61. cr.opration();
  62. return 0;
  63. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/907906
推荐阅读
相关标签
  

闽ICP备14008679号