• Factory Method(工厂方法)-对象创建型模式


    1.意图

        定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

    2.动机

        框架使用抽象类定义和维护对象之间的关系。这些对象的创建通常也由框架负责。

    3.适用性

    • 当一个类不知道它所必须创建的对象的类的时候。
    • 当一个类希望由它的子类来指定它所创建的对象的时候。
    • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一局部化的时候。

    4.结构

             

    5.代码实例

        

    class Product
    {
    public:
        virtual ~Product() = 0;
    };
    
    class OneProduct : public Product
    {
    public:
        OneProduct();
    };
    
    class TwoProduct : public Product
    {
    public:
        TwoProduct();
    };
    
    class ThreeProduct : public Product
    {
    public:
        ThreeProduct();
    };
    
    class FourProduct : public Product
    {
    public:
        FourProduct();
    };
    Product.h
    #include <memory>
    
    class Product;
    class Creator
    {
    public:
        virtual std::shared_ptr<Product> FactoryMethod() = 0;
    };
    
    class OneCreator : public Creator
    {
    public:
        std::shared_ptr<Product> FactoryMethod();
    };
    
    class TwoCreator : public Creator
    {
    public:
        std::shared_ptr<Product> FactoryMethod();
    };
    
    
    class ThreeCreator : public Creator
    {
    public:
        std::shared_ptr<Product> FactoryMethod();
    };
    
    
    class FourCreator : public Creator
    {
    public:
        std::shared_ptr<Product> FactoryMethod();
    };
    Creator.h
    #include "Product.h"
    #include <iostream>
    
    Product::~Product()
    {
    
    }
    
    
    OneProduct::OneProduct()
    {
        std::cout << "OneProduct Created" << std::endl;
    }
    
    TwoProduct::TwoProduct()
    {
        std::cout << "TwoProduct Created" << std::endl;
    }
    
    ThreeProduct::ThreeProduct()
    {
        std::cout << "ThreeProduct Created" << std::endl;
    }
    
    FourProduct::FourProduct()
    {
        std::cout << "FourProduct Created" << std::endl;
    }
    Product.cpp
    #include "Creator.h"
    #include "Product.h"
    
    
    std::shared_ptr<Product> OneCreator::FactoryMethod()
    {
        auto pProduct = std::shared_ptr<Product>(new OneProduct());
        return pProduct;
    }
    
    std::shared_ptr<Product> TwoCreator::FactoryMethod()
    {
        auto pProduct = std::shared_ptr<Product>(new TwoProduct());
        return pProduct;
    }
    
    std::shared_ptr<Product> ThreeCreator::FactoryMethod()
    {
        auto pProduct = std::shared_ptr<Product>(new ThreeProduct());
        return pProduct;
    }
    
    std::shared_ptr<Product> FourCreator::FactoryMethod()
    {
        auto pProduct = std::shared_ptr<Product>(new FourProduct());
        return pProduct;
    }
    Creator.cpp
    #include<memory>
    #include"Creator.h"
    
    int main()
    {
        auto pOneCreator = std::shared_ptr<OneCreator>(new OneCreator());
        auto pOneProduct = pOneCreator->FactoryMethod();
    
        auto pTwoCreator = std::shared_ptr<TwoCreator>(new TwoCreator());
        auto pTwoProduct = pTwoCreator->FactoryMethod();
    
        auto pThreeCreator = std::shared_ptr<ThreeCreator>(new ThreeCreator());
        auto pThreeProduct = pThreeCreator->FactoryMethod();
    
        auto pFourCreator = std::shared_ptr<FourCreator>(new FourCreator());
        auto pFourProduct = pFourCreator->FactoryMethod();
    
        while(1);
    }
    Test.cpp

    6.测试结果

    7.效果

    • 优点:代码仅处理Product接口,不再绑定特定的ConcreteProduct。
    • 缺点:一个工厂方法仅创建一种产品,创建特定的ConcreteProduct需要创建Creator的子类。

    8.变形

        工厂方法的变形是:可以参数化工厂方法,以使工厂方法可以创建多种产品。

     

  • 相关阅读:
    使用protobuf生成代码import包找不到
    SQL 对邮箱数据的处理(分类统计)
    Hive 集合函数 collect_set() collect_list()
    菜谱分享网站微信小程序开发说明(1)-介绍与运行
    windows 下查看端口占用
    Windows下安装Maven自定义仓库配置阿里下载源,配置Ecplise、IDEA
    Windows下安装Node.js完整详细教程
    开启Centos8的SSH服务
    Openwrt与IPTV之二----udpxy
    Openwrt与IPTV之一----igmpproxy
  • 原文地址:https://www.cnblogs.com/mgp200866130/p/5463698.html
Copyright © 2020-2023  润新知