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.变形

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

     

  • 相关阅读:
    【Visual C++】游戏开发笔记之六——游戏画面绘图(三)透明特效的制作方法
    【不定期更新】游戏开发中的一些良好习惯与技术技巧
    【Visual C++】游戏开发笔记之七——基础动画显示(一)定时器的使用
    【超级经典】程序员装B指南(转)
    Gentoo安装小记
    图形学中的贴图采样、走样与反走样等
    面试题之银行业务调度系统
    四川雅安芦山加油挺住
    ZOJ 3223 Journey to the Center of the Earth
    android中ListView拖动时背景黑色的问题
  • 原文地址:https://www.cnblogs.com/mgp200866130/p/5463698.html
Copyright © 2011-2022 走看看