• 2 创建型模式-----工厂方法模式


    简单工厂模式的不足:加入新产品的同时需要修改工厂类,违背“开闭原则”。

    模式动机:增加一个抽象工厂类,再定义具体工厂类来生产具体的产品,增加新产品时只需要添加产品类和对应的具体工厂类即可。由于我们是对抽象工厂进行编程,因此可以在不修改抽象工厂的前提下增加新产品。

    模式定义:工厂方法模式(Factory Method Pattern)又称工厂模式、虚构造器。该模式下,抽象工厂负责创建产品的公共接口,具体工厂继承自该接口来具体生产产品,这样就相当于将产品的实例化延迟到工厂子类中完成。

    模式结构图:

     

    模式代码:

    bt_工厂方法模式.h:

     1 #ifndef FMP_H
     2 #define FMP_H
     3 #include <iostream>
     4 
     5 /*
     6     定义抽象产品类
     7 */
     8 class Product
     9 {
    10 public:
    11     virtual ~Product(){}
    12 };
    13 
    14 /*
    15     定义具体产品类
    16 */
    17 class ConcreteProduct : public Product
    18 {
    19 public:
    20     ConcreteProduct();
    21 };
    22 ConcreteProduct::ConcreteProduct()
    23 {
    24     std::cout << "创建具体产品" << std::endl;
    25 }
    26 
    27 /*
    28     定义工厂接口
    29 */
    30 class Factory
    31 {
    32 public:
    33     virtual ~Factory(){ }
    34     virtual Product* factoryMethod() = 0;
    35 };
    36 
    37 class ConcreteFactory : public Factory
    38 {
    39 public:
    40     virtual Product* factoryMethod();
    41 };
    42 Product* ConcreteFactory::factoryMethod()
    43 {
    44     return new ConcreteProduct;
    45 }
    46 
    47 #endif // FMP_H

    bt_工厂方法模式.cpp:

     

     1 #include "bt_工厂方法模式.h"
     2 #include <iostream>
     3 
     4 int main()
     5 {
     6     std::cout << "***** 工厂方法模式测试 *****" << std::endl;
     7     Factory* factory = NULL;
     8     factory = new ConcreteFactory;
     9     Product* product = NULL;
    10    product = factory->factoryMethod();
    11 
    12     delete product;
    13     delete factory;
    14 
    15     return 0;
    16 }           
    
    

     

    模式优缺点:

    • 客户创建具体产品时只需和具体工厂打交道,无需关注产品创建细节;在系统中加入新产品时,只需添加产品类和具体工厂类,无需修改抽象工厂与抽象产品类,而这就意味着无需修改与用户接口,系统扩展性提高,符合“开闭原则”。
    • 缺点是每次增加一个新产品需要添加两个具体类,如果产品种类很多,系统就会变得臃肿。

     

     

  • 相关阅读:
    shell学习笔记(3)shell运算符
    封装gorm的CRUD操作
    装饰器的使用
    shell学习笔记(2)
    shell学习笔记(6)test命令
    原地翻转或旋转矩阵
    shell学习笔记(5)printf输出
    回溯算法的所有排列、组合、子集问题
    Web Dynpro for ABAP(5):System Logon
    Web Dynpro for ABAP(6):Context in Detail
  • 原文地址:https://www.cnblogs.com/benxintuzi/p/4536320.html
Copyright © 2020-2023  润新知