原型模式

转载 2013年12月05日 17:00:37

定义:

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
Prototype原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。

解决什么问题:

它主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。

带Prototype Manager的原型模式:

客户(Client)角色:客户端类向原型管理器提出创建对象的请求。[1]
抽象原型(Prototype)角色:这是一个抽象角色,通常由一个C#接口或抽象类实现。此角色给出所有的具体原型类所需的接口。在C#中,抽象原型角色通常实现了ICloneable接口。
具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。
原型管理器(Prototype Manager)角色:创建具体原型类的对象,并记录每一个被创建的对象。
代码实现如下:
/ CplusplusPrototype.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
#include<vector>
#include<assert.h>
usingnamespace std;
//父类
class Resume
{
protected:
char *name;
public:
Resume() {}
virtual ~Resume() {}
virtual Resume* Clone() { return NULL; }
virtualvoid Set(char *n) {}
virtualvoid Show() {}
};
class ResumeA : public Resume
{
public:
ResumeA(constchar *str); //构造函数
ResumeA(const ResumeA &r); //拷贝构造函数
~ResumeA(); //析构函数
ResumeA* Clone(); //克隆,关键所在
void Show(); //显示内容
};
ResumeA::ResumeA(constchar *str)
{
if(str == NULL) {
name = newchar[1];
name[0] = '\0';
}
else {
name = newchar[strlen(str)+1];
strcpy(name, str);
}
}
ResumeA::~ResumeA() { delete [] name;}
ResumeA::ResumeA(const ResumeA &r) {
name = newchar[strlen(r.name)+1];
strcpy(name, r.name);
}
ResumeA* ResumeA::Clone() {
returnnew ResumeA(*this);
}
void ResumeA::Show() {
cout<<"ResumeA name : "<<name<<endl;
}
class ResumeB : public Resume
{
public:
ResumeB(constchar *str); //构造函数
ResumeB(const ResumeB &r); //拷贝构造函数
~ResumeB(); //析构函数
ResumeB* Clone(); //克隆,关键所在
void Show(); //显示内容
};
ResumeB::ResumeB(constchar *str)
{
if(str == NULL) {
name = newchar[1];
name[0] = '\0';
}
else {
name = newchar[strlen(str)+1];
strcpy(name, str);
}
}
ResumeB::~ResumeB() { delete [] name;}
ResumeB::ResumeB(const ResumeB &r) {
name = newchar[strlen(r.name)+1];
strcpy(name, r.name);
}
ResumeB* ResumeB::Clone() {
returnnew ResumeB(*this);
}
void ResumeB::Show() {
cout<<"ResumeB name : "<<name<<endl;
}
class ResumeManager
{
private:
vector<Resume *> mResume;
public:
ResumeManager()
{
}
void add(Resume * resume)
{
mResume.push_back(resume);
}
Resume * get(int index) const
{
assert(index>=0 && index<mResume.size());
return mResume[index];
}
};
int _tmain(int argc, _TCHAR* argv[])
{
ResumeManager *manager = new ResumeManager();
Resume *r1 = new ResumeA("A");
Resume *r2 = new ResumeB("B");
manager->add(r1);
manager->add(r2);
manager->get(0)->Show();
manager->get(1)->Show();
Resume *r3 = manager->get(0)->Clone();
Resume *r4 = manager->get(1)->Clone();
//删除r1,r2
delete r1; delete r2;
r1 = r2 = NULL;
//深拷贝所以对r3,r4无影响
r3->Show(); r4->Show();
delete r3; delete r4;
r3 = r4 = NULL;
return 0;
}

设计模式(六)原型模式

一、说说鸣人的影分身 话说鸣人听了水木老师的建议偷出了卷轴并且学会了一招禁术:影分身之术。当鸣人使用影分身之术的时候就会有好多个和鸣人一模一样的人出现,就像复制出来的一样,这种影分身之术在面向对象的...
  • xingjiarong
  • xingjiarong
  • 2015年11月28日 16:13
  • 1685

原型模式的使用分析

原型模式是一种简单、易使用的创建型设计模式,通过给出一个原型对象来指明所创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。原型模式要求对象实现一个可以“克隆”自身的接口,这样就可以...
  • u010024991
  • u010024991
  • 2016年12月02日 11:18
  • 1275

JavaScript 原型模式

JavaScript原型模式 1. 普通对象 var o1 = {} var o2 = new Object() var o3 = new f1() 除了函数对象就是普通对象 2. ...
  • qq_38860226
  • qq_38860226
  • 2018年01月16日 10:03
  • 24

iOS 设计模式之原型模式 (Prototype)

原型模式从一个对象在创建另一个对象,而不需知道任何创建细节。一般在初始化信息不变化的情况下,使用原型模式是最好的方法,即隐藏了对象创建的细节,对性能又大大提高。在 iOS 开发中,体现原型模式的是 c...
  • a12a33
  • a12a33
  • 2016年02月23日 09:36
  • 441

Java设计模式(五) 原型模式详解

在开发过程中,有时会遇到为一个类创建多个实例的情况,这些实例内部成员往往完全相同或有细微的差异,而且实例的创建开销比较大或者需要输入较多参数,如果能通过复制一个已创建的对象实例来重复创建多个相同的对象...
  • u013916933
  • u013916933
  • 2016年06月04日 16:22
  • 3097

C++原型模式

原型模式(Prototype Pattern)是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,而无需知道任何创建的细节。...
  • u011012932
  • u011012932
  • 2017年03月27日 11:39
  • 1190

设计模式--原型模式

1.设计模式分类         所谓设计模式,是前人在开发过程中总结的经验。各自有各自的使用情况。分类条件不同 设计模式的分类也不尽相同。编程之道中大致分类如下 创建型 包括 单例设计模式,简单工厂...
  • a316212802
  • a316212802
  • 2015年11月13日 18:45
  • 1001

JAVA设计模式之原型模式

定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 类型:创建类模式 类图: 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype...
  • jason0539
  • jason0539
  • 2014年04月08日 08:22
  • 15421

Java设计模式——原型模式

原型模式是为了解决一些不必要的对象创建过程。当Java JDK中提供了Cloneable接口之后,原型模式就变得异常的简单了。虽然由于Cloneable的引入使用程序变得更简单了,不过还是有一些需要说...
  • u013761665
  • u013761665
  • 2016年03月03日 13:50
  • 1990

【设计模式】——原型模式VS模板方法模式

不知道何种原因总是把原型模式和模板方法模式搞混,着实很苦恼啊!不知道大家是否有同样的困扰,有的话治疗,没有的话预防啊。故该文章进行详细对比学习! 原型模式     所谓的原型模式:用原型实例指定创建对...
  • jiadajing267
  • jiadajing267
  • 2015年11月02日 19:47
  • 1020
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:原型模式
举报原因:
原因补充:

(最多只允许输入30个字)