原型模式和模板方法模式

原型模式和模板方法模式

原型模式

  • 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

  • 其中心思想就是克隆。举个例子,我们经常性需要复印身份证复印件,有时需要几张,其实就是克隆,关于代码和UML类图,我就不再多描述了,因为这个太简单了,就是定义一个拷贝构造函数,定义一个clone函数,在clone里面new this指针就可以了。

模板方法模式

  • 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中实现。

  • 举个例子,我们在开发中,经常需要写DD,也就是详细设计,一般项目组都会有标准的模板,假如这个模板由模块描述、模块组成、接口设计、流程图这四个部分组成(现实生活中可能不一样,会有更多内容,这里仅仅假设,是为了表达模板方法模式的思想)。一个软件系统一般都是由很多模块组成的,每个都需要写DD,那我们只需要按模板,将自己模块的东西填写进去就可以,然后提交就OK。如果这个需要我们用C++实现,那我们该怎么实现那?

  • 我们可以设置一个模板基类,定义模块描述、模块组成、接口设计、流程图这四个虚函数,再在基类中定义一个不是虚函数,名字提交的函数,每个模块去继承这个基类,并实现自己的模块描述、模块组成、接口设计、流程图这个四个部分就可以了,我们调用就用基类去new对应的模块类,调用基类的提交函数就是实现了。假如我们现在有pwer和network两个模块需要写DD,那其UML类图如下所示:

  • #include <iostream>
    using namespace std;
    
    class BaseTemplate
    {
    protected:
        virtual void moduleDescription(){} ; //模块描述
        virtual void moduleComposition(){}; //模块组成
        virtual void interfaceDesign() {};      //接口设计
        virtual void flowChart(){};          //流程图
    public:
        void submit()
        {
            moduleDescription();
            moduleComposition();
            interfaceDesign();
            flowChart();
        }
    };
    
    class Network : public BaseTemplate
    {
    protected:
        virtual void moduleDescription() //模块描述
        {
            cout<<" Network moduleDescription() "<<endl;
        }  
        virtual void moduleComposition()//模块组成
        {
            cout<<" Network moduleComposition() "<<endl;
        }; 
        virtual void interfaceDesign() //接口设计
        {
            cout<<" Network interfaceDesign() "<<endl;
        };      
        virtual void flowChart() //流程图
        {
            cout<<" Network flowChart() "<<endl;
        };          
    };
    
    class Power : public BaseTemplate
    {
    public:
        virtual void moduleDescription() //模块描述
        {
            cout<<" Power moduleDescription() "<<endl;
        }  
        virtual void moduleComposition()//模块组成
        {
            cout<<" Power moduleComposition() "<<endl;
        }; 
        virtual void interfaceDesign() //接口设计
        {
            cout<<" Power interfaceDesign() "<<endl;
        };      
        virtual void flowChart() //流程图
        {
            cout<<" Power flowChart() "<<endl;
        };          
    };
    
    
    int main(int argc,char** argv)
    {
        BaseTemplate* moduleA = new Network();
        moduleA->submit();
    
        BaseTemplate* moduleB = new Power();
        moduleB->submit();
        delete moduleA, moduleB;
    
        return 0;
    }

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jayues_lies

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值