设计模式 - 原型模式

1.原型模式

1.概述
用一个已经创建的实例为原型,通过复制该原型对象创建一个和原型对象相同的新对象
用一个已经创建的实例为原型,来创建一个和原型对象相同的新对象。

2.结构
1.(Prototype)抽象原型类
抽象原型类是定义具有克隆自己的方法的接口,是所有具体原型类的公共父类。

2.ConcretePrototype(具体原型类)
具体原型类实现具体的克隆方法,在克隆方法中返回自己的一个克隆对象。

3.Client (客户类)
客户类让一个原型克隆自身,从而创建一个新的对象。在客户类中只需要直接实例化或通过工厂方法等创建一个对象,再通过调用该对象的克隆方法复制得到多个相同的对象。
原型模式分类:
原型模式克隆对象时,根据其成员对象是否也在克隆,原型模式可以分为两种形式,深克隆和浅克隆。

1.3 优缺点
优点:
(1)当创建新的对象实例较为复杂时,使用原型模式可以简化对象的创建过程
(2)可以动态的减少或增加产品类。
缺点:
(1)需要为每一个类配备一个克隆方法,而且对这个克隆方法需要对类的功能进行通盘考虑。
(2)在实现克隆时,需要编写较为复杂的代码。

1.4 适用场景
(1)创建新对象成本较大(如初始化需要较长的时间),新对象可通过原型模式对已有对象进行复制来获得。

1.5 应用举例
原型模式提供了一个通过已存在对象进行新对象创建的接口(Clone),Clone()实现和具体的实现语言相关,在 C++中我们将通过拷贝构造函数实现之。

#include <iostream> 
using namespace std; 
/*抽象原型类*/
class Student
{
protected:
    int id;
    char name[10];
public:
    virtual Student* Clone() = 0;
    virtual void Show() = 0;
};
/*具体原型类*/
class StudentTypeA :public Student
{
public:
    StudentTypeA(const char* name_input)
    {
        strcpy(name, name_input);
        this->id = 0;
        cout << "Construction....." << endl;
    }
    StudentTypeA(const StudentTypeA& other)
    {
        cout << "Copy Construction..." << endl;
        this->id = other.id;
        this->id++;
        strcpy(this->name, other.name);
    }
    virtual StudentTypeA* Clone()
    {
        StudentTypeA* tmp = new StudentTypeA(*this);
        return tmp;
    }
    void Show()
    {
        cout << "Student id == " << id << " name == " << name << endl;
    }
    ~StudentTypeA()
    {
        cout << "Deconstruction StudentTypeA" << endl;
    }
};
int main() 
{ 
  Student *student1 = new StudentTypeA("xiaoming"); 
  Student *student2 = student1->Clone(); 
  Student *student3 = student2->Clone();   
    
  student1->Show(); 
  student2->Show(); 
  student3->Show();   
  return 0; 
} 

总结:
其实这个设计模式比较简单,我们总结一下具体操作步骤。

1、声明一个抽象基类,并定义clone()函数为纯虚函数。

2、实例化各个子类,并且实现复制构造函数,并实现clone()函数

原型模式通过复制原型(原型)而获得新对象创建的功能,这里原型本身就是"对象工厂"(因为能够生产对象),实际上原型模式和 Builder 模式、AbstractFactory 模式都是通过一个类(对象实例)来专门负责对象的创建工作(工厂对象),它们之间的区别是: Builder 模式重在复杂对象的一步步创建(并不直接返回对象),AbstractFactory 模式重在产生多个相互依赖类的对象,而原型模式重在从自身复制自己创建新类。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值