[创建型模型] 原型模式

发布于:2024-03-29 ⋅ 阅读:(19) ⋅ 点赞:(0)

一 介绍

原型设计模式,允许通过复制已有对象的实例,来创建新的对象,并且不需要显示的实例化过程。

目的是通过复制现有对象来创建新对象,从而减少了对象的实例化开销。(避免了一些数据的初始化,读取,加载数据,资源的获取等)

二 原理

  1. 定义一个原型接口:首先需要定义一个原型接口,通常是一个抽象类或接口,其中声明了一个克隆方法用于复制对象。

  2. 实现原型类:创建具体的原型类,实现原型接口,并实现克隆方法,该方法用于返回当前对象的副本。

  3. 使用克隆方法创建新对象:当需要创建新对象时,调用原型对象的克隆方法,从而生成一个新的对象实例。并且克隆这个对象不需要使用构造函数。

三 使用场景

  • 对象创建开销大:当对象的创建过程涉及到复杂的初始化操作或需要大量资源时,使用原型模式可以避免重复执行这些操作,提高性能。

  • c避免构造函数复杂度:当一个类的构造函数非常复杂,或者构造函数的参数组合非常多时,使用原型模式可以避免构造函数的复杂度,通过克隆现有对象来创建新对象。

  • 需要避免继承的代价:在某些情况下,由于类的结构复杂性或者多重继承的问题,继承不是一个好的选择。此时,原型模式可以作为一个替代方案,通过复制现有对象来创建新对象,而不需要通过继承来实现。

  • 保护对象的成员变量:有时候需要创建一个对象的副本,并对副本进行修改,而不影响原始对象。使用原型模式可以很容易地实现这一点,因为克隆对象与原始对象相互独立。

四 理解

  • 简单来说,就是克隆,并且当这个对象的初始化,已经构造函数的传参,或者其他操作比较复杂时,使用原型模式来简化这种操作是及其方便的。
  • 使用原型模式,可以更加灵活,因为我们可以将调用接口设置为多态。也就是说,克隆可能会在父类和子类之间进行,并且可能是动态的,很明显通过父类的拷贝构造函数无法实现对子类对象的拷贝。
  • 原型模式的实现主要是clone接口,但同时也要注意深浅拷贝的问题。

五 UML类图

六 代码实现

#include <iostream>
#include <windows.h>
using namespace std;

class CloneTrooper
{
public:
    virtual CloneTrooper* clone() = 0;
    virtual void arms() = 0;
    virtual ~CloneTrooper(){}
};


class CloneTrooperNavy : public CloneTrooper
{
public:
    virtual CloneTrooperNavy* clone() override
    {
        return new CloneTrooperNavy(*this);
    }
    virtual void arms() override
    {
        cout<<"海军052D驱逐舰"<<endl;
    }
    virtual ~CloneTrooperNavy(){}
};

class CloneTrooperArmy : public CloneTrooper
{
public:
    virtual CloneTrooperArmy* clone()override
    {
        return new CloneTrooperArmy(*this);
    }
    virtual void arms() override
    {
        cout<<"陆军合成旅"<<endl;
    }
    virtual ~CloneTrooperArmy(){}
};


int main()
{
    SetConsoleOutputCP(CP_UTF8);
    CloneTrooper* obj = new CloneTrooperNavy;
    CloneTrooper* Trooper = obj->clone();
    Trooper->arms();

    obj = new CloneTrooperArmy;
    Trooper = obj->clone();
    Trooper->arms();
    delete Trooper;
    delete obj;
    return 0;
}

本文含有隐藏内容,请 开通VIP 后查看