原型模式和模板方法模式(C++)

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

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

  我还是主要记录下模板方法模式吧,感觉这个还是蛮有意思的。

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

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

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

也许上面的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;
}

输出接口如下:

   每种设计模式,每次学习时,都有"温故而知新"的感觉,那我们就多多温故,多多知新吧,因为学无止境.........................

原文地址:https://www.cnblogs.com/huiz/p/8371263.html

时间: 2024-08-12 21:15:47

原型模式和模板方法模式(C++)的相关文章

Android设计模式之命令模式、策略模式、模板方法模式

命令模式是其它很多行为型模式的基础模式.策略模式是命令模式的一个特例,而策略模式又和模板方法模式都是算法替换的实现,只不过替换的方式不同.下面来谈谈这三个模式. 命令模式 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作. java中传递(注入)对象很容易,但是却不支持直接传递行为(即传递函数或者说传递方法),只能间接的通过传递(注入)一个对象,再调用它的行为来实现.如果把这样的行为抽取出来为一个类,称作命令类,它的具体实现都是命令

建造者模式和模板方法模式扩展篇

建造者模式和模板方法模式扩展篇 UML 与抽象工厂模式比较 本模式可以看出与抽象工厂非常类似,都是产生不同的产品,怎么区分这两种设计的使用场景呢 - 建造者模式关注的是基本方法的调用顺序,而零件(基本方法)已经准备好 - 抽象工厂关注的零件的生产(基本方法的实现),而组装顺序已经确定 实现 产品抽象 public abstract class Product { public abstract void doSomeThing(); } 产品A public class AProduct ext

编程模式之模板方法模式(Template Method)

模板方法模式由两个角色组成:父类角色,子类角色. 父类角色:提供模板. 子类角色:为父类模板提供实现. 类图: JAVA代码: AbstractClass.java package com.templatemethod; public abstract class AbstractClass { /** * 定义了算法的骨架,即步骤 */ public void template() { this.method1(); this.method2(); this.method3(); } /**

java模式之-模板方法模式

模板方法模式是java设计模式常见的模式之一. <JAVA与模式>中写道: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 下面是自己写的小demo,便于理解模板方法模式. 1.父类 package com.westward; public abstract class GoToCity { /** *

C#设计模式之行为类模式:模板方法模式

定义(Template Method) 定义一个操作中算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 启示 组装电脑一般包含三个部分,主机.显示器.输入设备(键鼠),而不同品牌电脑的组装都各不相同,但是最终组装成一部完整的电脑的步骤都是固定一样的.定义抽象类,暴露主机.显示器.输入设备(键鼠)的组装给具体厂商去实现,提供一个公共的最终组装方法. /// <summary> /// 组装电脑 /// </summary> pub

java设计模式7.策略模式、模板方法模式、观察者模式

策略模式 策略模式的用意,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 环境角色:持有一个抽象策略角色的引用. 抽象策略角色:给出所有的具体策略类所要实现的接口. 具体策略角色:包装相关的算法或行为. 模板方法模式 模板方法的用意,使用一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以用不同的方式来实现这些抽象方法. 抽象模板角色:1. 定义一个或多

设计模式——行为型模式之模板方法模式(一)

模板模式 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计模式属于行为型模式. 介绍 意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 主要解决:一些方法通用,却在每一个子类都重新写了这一方法. 何时使用:有一些通用的方法. 如何解决:将这些通用算法抽象出来. 关键代码:在抽象类实现,其

【行为型模式】模板方法模式(template method)之23种java设计模式

BankTemplateMethod抽象类 public abstract class BankTemplateMethod { //具体方法 public void takeNumber(){ System.out.println("取号排队"); } public abstract void transact(); //办理具体的业务 //钩子方法 public void evaluate(){ System.out.println("反馈评分"); } pub

《Head First 设计模式》学习笔记——模板方法模式

模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 设计模式 模板方法模式:在一个方法中定义一个算法的框架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结果的情况下,重新定义算法中的某些步骤. 模板就是一个方法,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现.这样可以确