zoukankan      html  css  js  c++  java
  • 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.变形

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

     

  • 相关阅读:
    Linux 学习 step by step (1)
    ubuntu server nginx 安装与配置
    ubuntu server samba服务器配置
    iOS app集成支付宝支付流程及后台php订单签名处理
    mac 连接windows 共享内容
    linux 文件查找,which,whereis,locate,find
    ubuntu server vsftpd 虚拟用户及目录
    ubuntu server 安装 mantis bug tracker 中文配置
    ubuntu server vsftpd 匿名用户上传下载及目录设置
    linux 用户管理,用户权限管理,用户组管理
  • 原文地址:https://www.cnblogs.com/mgp200866130/p/5463698.html
Copyright © 2011-2022 走看看