【C++ 设计模式】5.原型模式

作者: JeremyYv | 来源:发表于2019-10-15 21:50 被阅读0次
  • 原型模式:一种创建型设计模式


  • 应用场景:

    一个基类,有很多派生类,在实际开发中,经常会使用一个基类指针,将其指向不同派生类的实例,以实现多态。
    之后经过很长的业务操作之后,需要一个该派生类对象的拷贝,但此时会遇到一个问题,如果将该指针解引用后传入拷贝构造函数,new时是需要确定对象类型的,但由于C++没有反射机制,此时对象的实际类型可能会很难或无法确定,所以原型模式登场了。

    举例:

    有一个果汁的抽象类和各品种果汁的实现类,我们使用了一个果汁类的基类指针指向了一个派生的葡萄汁实例。在过了很久很久之后,需要创建一份该指针所指向果汁的拷贝,但此时单纯通过这个基类指针是没有办法确定该果汁的品种的,所以我们需要每个品种的果汁类都能提供一个方法,用以获得该品种果汁的拷贝。

  • 实现方式:

    首先,在基类中添加一个用于派生类拷贝的纯虚函数Clone(),每个想要被实例化的派生类都需要去实现该方法。
    然后,为了使用户(其他开发人员)能够通过该方法获得当前派生类对象的拷贝,在该方法中调用自身类的拷贝构造函数。
    最后,将自身(*this)传入拷贝构造函数。

  • 优点:
    无需确定基类指针所指向的对象类型,即可获得相同类型的实例,提高了创建效率。

  • 缺点:
    每个派生类都需要实现Clone()方法,增加了代码量。


以下是原型模式的简易代码实现
#include <iostream>
using namespace std;

//果汁的抽象类
class Juice
{
public:
    virtual Juice* Clone() = 0; // 用于对象类型拷贝
    virtual void Show() = 0; // 验证果汁类型
};

//派生类
class OrangeJuice : public Juice
{
public:
    virtual Juice* Clone()
    {
        return new OrangeJuice(*this); // 返回当前对象类型的拷贝
    }

    virtual void Show()
    {
        cout << "Orange Juice" << endl;
    }
};

class LemonJuice : public Juice
{
public:
    virtual Juice* Clone()
    {
        return new LemonJuice(*this);
    }

    virtual void Show()
    {
        cout << "Lemon Juice" << endl;
    }
};

class AppleJuice : public Juice
{
public:
    virtual Juice* Clone()
    {
        return new AppleJuice(*this);
    }

    virtual void Show()
    {
        cout << "Apple Juice" << endl;
    }
};
主函数中的使用
#include <iostream>
#include "prototype.h"
using namespace std;
int main()
{
    Juice* pJuice = new AppleJuice(); // 基类指针指向派生类对象
    pJuice->Show();
    /*
     * 经过/传递了很久很久之后
     * 以至于忘记了或难以确定
     * 该基类指针所指向的对象具体类型
     */
    Juice* pNewJuice = pJuice->Clone(); // 获取拷贝对象
    pNewJuice->Show();
    return 0;
}
控制台输出结果
Apple Juice
Apple Juice

相关文章

  • 【C++ 设计模式】5.原型模式

    原型模式:一种创建型设计模式 应用场景:一个基类,有很多派生类,在实际开发中,经常会使用一个基类指针,将其指向不同...

  • Java设计模式

    //设计模式/** 创建型模式* 1.工厂模式* 2.抽象工厂模式* 3.单例模式* 4.建造者模式* 5.原型模...

  • JavaJavascript基础进阶(十七)JS中常用的设计模式

    单利设计模式、构造原型设计模式、发布订阅设计模式、promise设计模式 单利模式 构造原型设计模式 最贴近OOP...

  • C++设计模式-第二篇 (Boolan)

    C++设计模式-第二篇 (Boolan) 本章内容:1 工厂方法模式2 抽象工厂模式3 原型模式4 构建器模式5 ...

  • 38种Javascript设计模式

    38种设计模式 1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式 4.建造者模式 5.原型模式 6.单例模式 ...

  • c#面向对象10--简单工厂设计模式

    23种设计模式 1.单例模式2.抽象工厂模式3.工厂方法模式4.建造者模式5.原型模式6.适配器模式7.装饰器模式...

  • Spring 准备内容

    准备内容 原型设计模式 PropotypeModle 原型模式也属于创造型设计模式,用原型实例指定创建对象的种类,...

  • JavaScript创建对象

    创建对象 1.工厂模式 2.构造函数模式 3.原型模式 4.组合使用构造函数模式和原型模式 5.动态原型模式 6....

  • 创建对象模式

    1.工厂模式 2.构造函数模式 3.原型模式 4.组合使用构造函数模式和原型模式 5.动态原型模式 6.寄生构造函数模式

  • 设计模式问答(一)

    设计模式问答(一) 什么是设计模式?您能说出工厂模式、抽象工厂模式、创建者模式、原型模式、原型模式的潜复制及深复制...

网友评论

    本文标题:【C++ 设计模式】5.原型模式

    本文链接:https://www.haomeiwen.com/subject/ucdemctx.html