cpp: Prototype Pattern

25 篇文章 0 订阅
这段代码展示了如何在C++中使用原型模式来创建可克隆的黄金类,包括黄金公司、商贸商会和连锁店。每个类都实现了抽象的克隆方法,通过拷贝构造函数实现对象复制。在GeovinDu类中,展示了如何使用这些原型对象进行克隆并进行业务操作。
摘要由CSDN通过智能技术生成
// Gold.h : 此文件包含 "Gold" 类。原型模式  Prototype Pattern C++ 14
// 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit.
 
 
 
#pragma once
#ifndef GOLD_H
#define GOLD_H
 
 
 
#include <iostream>
 
 
using namespace std;
 
 
 
 
namespace DuJewelryPrototypePattern
{
 
    /// <summary>
    /// 黄金
    /// </summary>
    class Gold
    {
 
    public:
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="life"></param>
        /// <param name="magic"></param>
        /// <param name="attack"></param>
        Gold(int technology, int business, int talents) :Gtechnology(technology), Gbusiness(business), Gtalents(talents) {}
 
        /// <summary>
        /// 做父类时析构函数应该为虚函数
        /// </summary>
        virtual ~Gold() {}
 
    public:
        //virtual Monster* creatGold() = 0; //具体的实现在子类中进行
 
        /// <summary>
        /// 具体的实现在子类中进行
        /// </summary>
        /// <returns></returns>
        virtual Gold* clone() = 0;
 
    protected: //可能被子类访问的成员,用protected修饰
        //属性
 
        /// <summary>
        /// 技术
        /// </summary>
        int Gtechnology;  
 
        /// <summary>
        /// 业务
        /// </summary>
        int Gbusiness;
        /// <summary>
        /// 人才
        /// </summary>
        int Gtalents;
 
 
    };
}
 
#endif
 
 
// GoldCorporation.h : 此文件包含 "GoldCorporation" 类。原型模式  Prototype Pattern C++ 14
// 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit.
 
 
 
#pragma once
#ifndef GOLDCORPORATION_H
#define GOLDCORPORATION_H
 
 
 
#include <iostream>
#include "Gold.h"
 
using namespace std;
 
 
 
 
namespace DuJewelryPrototypePattern
{
 
    /// <summary>
    /// 黄金公司
    /// </summary>
    class GoldCorporation:public Gold
    {
    public:
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="technology"></param>
        /// <param name="business"></param>
        /// <param name="talents"></param>
        GoldCorporation(int technology, int business, int talents) :Gold(technology, business, talents)
        {
            cout << "创建了一个黄金公司" << endl;
        }
 
    public:
        /// <summary>
        /// 拷贝构造函数
        /// </summary>
        /// <param name="tmpobj"></param>
        GoldCorporation(const GoldCorporation& tmpobj) :Gold(tmpobj)
        {
            cout << "调用了GoldCorporation::GoldCorporation(const GoldCorporation& tmpobj)拷贝构造函数创建了一个黄金公司" << endl;
        }
        /// <summary>
        /// 拷贝构造函数
        /// </summary>
        /// <returns></returns>
        virtual Gold* clone()
        {
            //return new GoldCorporation(800, 950, 880); //创建黄金公司
            return new GoldCorporation(*this); //触发拷贝构造函数的调用来创建了一个黄金公司
        }
        //其他代码略....
 
 
 
    };
 
}
 
#endif
 
// GoldCommerce.h : 此文件包含 "GoldCommerce" 类。原型模式  Prototype Pattern C++ 14
// 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit.
 
 
 
#pragma once
#ifndef GOLDCOMMERCE_H
#define GOLDCOMMERCE_H
 
 
 
#include <iostream>
#include "Gold.h"
 
using namespace std;
 
 
 
 
namespace DuJewelryPrototypePattern
{
    /// <summary>
    /// 商贸商会
    /// </summary>
    class GoldCommerce :public Gold
    {
    public:
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="technology"></param>
        /// <param name="business"></param>
        /// <param name="talents"></param>
        GoldCommerce(int technology, int business, int talents) :Gold(technology, business, talents)
        {
            cout << "创建了一个商贸商会" << endl;
        }
 
    public:
        /// <summary>
        /// 拷贝构造函数
        /// </summary>
        /// <param name="tmpobj"></param>
        GoldCommerce(const GoldCommerce& tmpobj) :Gold(tmpobj) //初始化列表中注意对父类子对象的初始化
        {
            cout << "调用了GoldCommerce::GoldCommerce(const GoldCommerce& tmpobj)拷贝构造函数创建了一个商贸商会" << endl;
        }
 
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        virtual Gold* clone()
        {
            //return new GoldCommerce(800, 180, 990); //创建商贸商会
            return new GoldCommerce(*this);
        }
        //其他代码略....
 
    };
 
}
 
#endif
 
// GoldShop.h : 此文件包含 "GoldShop" 类。原型模式  Prototype Pattern C++ 14
// 2023年5月1日 涂聚文 Geovin Du Visual Studio 2022 edit.
 
 
 
#pragma once
#ifndef GOLDSHOP_H
#define GOLDSHOP_H
 
 
 
#include <iostream>
#include "Gold.h"
 
using namespace std;
 
 
 
 
namespace DuJewelryPrototypePattern
{
 
    /// <summary>
    /// 连锁店舖
    /// </summary>
    class GoldShop :public Gold
    {
    public:
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="technology"></param>
        /// <param name="business"></param>
        /// <param name="talents"></param>
        GoldShop(int technology, int business, int talents) :Gold(technology, business, talents)
        {
            cout << "创建了一个连锁店舖" << endl;
        }
 
    public:
        /// <summary>
        /// 拷贝构造函数
        /// </summary>
        /// <param name="tmpobj"></param>
        GoldShop(const GoldShop& tmpobj) :Gold(tmpobj)
        {
            cout << "调用了GoldShop::GoldShop(const GoldShop& tmpobj)拷贝构造函数创建了一个连锁店舖" << endl;
        }
 
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        virtual Gold* clone()
        {
            //return new GoldShop(800, 10, 110); //创建连锁店舖
            return new GoldShop(*this);
        }
        //其他代码略....
 
    };
 
}
 
#endif
// GeovinDu.h : 此文件包含 "GeovinDu" 类。。原型模式  Prototype Pattern C++ 14
// 2023年5月1日 涂聚文 Geovin Du edit.
#pragma once
#ifndef GEOVINDU_H
#define GEOVINDU_H
 
using namespace std;
 
namespace DuJewelryPrototypePattern
{
 
 
    class GeovinDu
    {
 
 
    private:
 
    public:
 
        /// <summary>
        ///
        /// </summary>
        void displayGold();
 
 
    };
 
}
 
#endif

// GeovinDu.cpp : 此文件包含 "GeovinDu" 类。。原型模式  Prototype Pattern C++ 14
// 2023年5月1日 涂聚文 Geovin Du edit.
 
 
#include "GeovinDu.h"
#include "Gold.h"
#include "GoldCommerce.h"
#include "GoldCorporation.h"
#include "GoldShop.h"
 
 
namespace DuJewelryPrototypePattern
{
 
    /// <summary>
    /// 全局的用于创建对象的函数
    /// </summary>
    /// <param name="pGold"></param>
    void GlobalCreateGold(Gold* pGold)
    {
        /*
        Gold* ptmpco = nullptr;
        if (dynamic_cast<GoldCommerce*>(pGold) != nullptr)
        {
            ptmpco = new GoldCommerce(300, 50, 80); //创建商贸商会
        }
        else if (dynamic_cast<GoldCorporation*>(pGold) != nullptr)
        {
            ptmpco = new GoldCorporation(200, 80, 100); //创建黄金公司
        }
        else if (dynamic_cast<GoldShop*>(pGold) != nullptr)
        {
            ptmpco = new GoldShop(400, 0, 110); //创建连锁店舖
        }
        if (ptmpco != nullptr)
        {
            //这里可以针对ptmpobj对象实现各种业务逻辑
            //......
            //不要忘记释放资源
            delete ptmpco;
        }
        */
        Gold* ptmpobj = pGold->clone();//根据已有对象直接创建新对象,不需要知道已有对象所属的类型
        //这里可以针对ptmpobj对象进行实现各种业务逻辑
        //......
        //不要忘记释放资源
        delete ptmpobj;
 
    }
 
    /// <summary>
    ///
    /// </summary>
    void GeovinDu::displayGold()
    {
 
        /**/
        DuJewelryPrototypePattern::GoldShop myPropMecGold(400, 0, 110); //创建连锁店舖对象作为原型对象以用于克隆目的
        DuJewelryPrototypePattern::Gold* pmyPropGoldCommerce = new DuJewelryPrototypePattern::GoldCommerce(200, 80, 100); //创建商贸商会对象作为原型对象以用于克隆目的,这里可以直接new,也可以通过工厂模式创建原型对象,取决于程序员自己的喜好
        //......
        DuJewelryPrototypePattern::Gold* p_CloneObj1 = myPropMecGold.clone(); //使用原型对象克隆出新的连锁店舖对象
        DuJewelryPrototypePattern::Gold* p_CloneObj2 = pmyPropGoldCommerce->clone(); //使用原型对象商贸商会对象
 
        //可以对p_CloneObj1、p_CloneObj2所指向的对象进行各种操作(实现具体业务逻辑)
        //......
 
        //释放资源
        //释放克隆出来的怪物对象
        delete p_CloneObj1;
        delete p_CloneObj2;
 
        //释放原型对象(堆中的)
        delete pmyPropGoldCommerce;
     
 
        DuJewelryPrototypePattern::Gold* pMonsterObj = new DuJewelryPrototypePattern::GoldCommerce(200, 80, 100);
        GlobalCreateGold(pMonsterObj);
        delete pMonsterObj;
 
 
    }
 
 
}

调用:、

// GeovinDu.cpp : 此文件包含 "GeovinDu" 类。。原型模式  Prototype Pattern C++ 14
// 2023年5月1日 涂聚文 Geovin Du edit.
 
 
#include "GeovinDu.h"
#include "Gold.h"
#include "GoldCommerce.h"
#include "GoldCorporation.h"
#include "GoldShop.h"
 
 
namespace DuJewelryPrototypePattern
{
 
    /// <summary>
    /// 全局的用于创建对象的函数
    /// </summary>
    /// <param name="pGold"></param>
    void GlobalCreateGold(Gold* pGold)
    {
        /*
        Gold* ptmpco = nullptr;
        if (dynamic_cast<GoldCommerce*>(pGold) != nullptr)
        {
            ptmpco = new GoldCommerce(300, 50, 80); //创建商贸商会
        }
        else if (dynamic_cast<GoldCorporation*>(pGold) != nullptr)
        {
            ptmpco = new GoldCorporation(200, 80, 100); //创建黄金公司
        }
        else if (dynamic_cast<GoldShop*>(pGold) != nullptr)
        {
            ptmpco = new GoldShop(400, 0, 110); //创建连锁店舖
        }
        if (ptmpco != nullptr)
        {
            //这里可以针对ptmpobj对象实现各种业务逻辑
            //......
            //不要忘记释放资源
            delete ptmpco;
        }
        */
        Gold* ptmpobj = pGold->clone();//根据已有对象直接创建新对象,不需要知道已有对象所属的类型
        //这里可以针对ptmpobj对象进行实现各种业务逻辑
        //......
        //不要忘记释放资源
        delete ptmpobj;
 
    }
 
    /// <summary>
    ///
    /// </summary>
    void GeovinDu::displayGold()
    {
 
        /**/
        DuJewelryPrototypePattern::GoldShop myPropMecGold(400, 0, 110); //创建连锁店舖对象作为原型对象以用于克隆目的
        DuJewelryPrototypePattern::Gold* pmyPropGoldCommerce = new DuJewelryPrototypePattern::GoldCommerce(200, 80, 100); //创建商贸商会对象作为原型对象以用于克隆目的,这里可以直接new,也可以通过工厂模式创建原型对象,取决于程序员自己的喜好
        //......
        DuJewelryPrototypePattern::Gold* p_CloneObj1 = myPropMecGold.clone(); //使用原型对象克隆出新的连锁店舖对象
        DuJewelryPrototypePattern::Gold* p_CloneObj2 = pmyPropGoldCommerce->clone(); //使用原型对象商贸商会对象
 
        //可以对p_CloneObj1、p_CloneObj2所指向的对象进行各种操作(实现具体业务逻辑)
        //......
 
        //释放资源
        //释放克隆出来的怪物对象
        delete p_CloneObj1;
        delete p_CloneObj2;
 
        //释放原型对象(堆中的)
        delete pmyPropGoldCommerce;
     
 
        DuJewelryPrototypePattern::Gold* pMonsterObj = new DuJewelryPrototypePattern::GoldCommerce(200, 80, 100);
        GlobalCreateGold(pMonsterObj);
        delete pMonsterObj;
 
 
    }
 
 
}

输出
 

Hello World!!Programa Olá Mundo!涂聚文 Geovin Du
创建了一个连锁店舖
创建了一个商贸商会
调用了GoldShop::GoldShop(const GoldShop& tmpobj)拷贝构造函数创建了一个连锁店舖
调用了GoldCommerce::GoldCommerce(const GoldCommerce& tmpobj)拷贝构造函数创建了一个商贸商会
创建了一个商贸商会
调用了GoldCommerce::GoldCommerce(const GoldCommerce& tmpobj)拷贝构造函数创建了一个商贸商会
请按任意键继续. . .

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值