原型(Prototype)模式

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

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

适用性:

  基本就是你需要从A的实例得到一份与A内容相同,但是又互不干扰的实例的话,就需要使用原型模式。

 优点:

  复制自身。客户不知道需要对象的实际类型,只需知道它的抽象基类即可。(即有继承树的情况)
 缺点:

  必须先有一个对象实例(即原型)才能clone。

示例一

“深拷贝”例子

#include <iostream>
using namespace std; // 原型模式,本质就是深拷贝 // 深拷贝,正确的原型模式
class PrototypeRight
{
private:
int a;
int *p; // 有一个指针
public:
PrototypeRight()
{
a = ;
p = new int();
} // 不使用默认的拷贝构造函数!
PrototypeRight(const PrototypeRight& obj)
{
a = obj.a;
p = new int(*obj.p);
} void outputPointerAddress()
{
cout << p << endl;
} ~PrototypeRight()
{
delete p;
}
}; int main()
{
// 这一部分是正确的原型模式的测试样例
PrototypeRight p1;
PrototypeRight p2 = p1;
p1.outputPointerAddress();
p2.outputPointerAddress();
return ;
} // 0x580f28
// 0x580fa8

可见指针值不同了,说明指向了不同的空间。

示例二

原型模式实现的关键就是实现Clone函数,对于C++来说,其实就是拷贝构造函数,需实现深拷贝,下面给出一种实现。

/*
原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
Created by Phoenix_FuliMa
*/ #include <iostream>
#include <string>
using namespace std; class Prototype
{
public:
virtual Prototype *Clone() = ;
virtual void display() = ;
}; class Prototype1:public Prototype
{
protected:
string name;
int id;
public:
Prototype1(string name, int id)
{
this->name = name;
this->id = id;
}
Prototype1(const Prototype1&type)
{
this->name = type.name;
this->id = type.id;
} virtual void display()
{
cout<<"my name and id are : " << this->id<<" "<< this->name <<endl;
}
Prototype *Clone()
{
return new Prototype1(*this);
}
}; class Prototype2:public Prototype
{
protected:
string name;
public:
Prototype2(string name)
{
this->name = name;
}
Prototype2(const Prototype2&type)
{
this->name = type.name;
} virtual void display()
{
cout<<"my name is : "<< this->name <<endl;
}
Prototype *Clone()
{
return new Prototype2(*this);
}
}; int main()
{
Prototype *obj1 = new Prototype1("mafuli", );
Prototype *obj2 = obj1->Clone();
Prototype *obj3 = obj2->Clone(); obj1->display();
obj2->display();
obj3->display(); Prototype *obj4 = new Prototype2("fulima");
Prototype *obj5 = obj4->Clone();
Prototype *obj6 = obj5->Clone(); obj4->display();
obj5->display();
obj6->display(); delete obj1;
delete obj2;
delete obj3;
delete obj4;
delete obj5;
delete obj6; system("pause");
return ;
} /*
my name and id are : 1 mafuli
my name and id are : 1 mafuli
my name and id are : 1 mafuli
my name is : fulima
my name is : fulima
my name is : fulima
*/

参考:http://blog.csdn.net/wuzhekai1985

设计模式 --> (6)原型模式的更多相关文章

  1. 设计模式_11_原型模式(prototype)深拷贝、浅拷贝

    设计模式_11_原型模式(prototype) 浅拷贝: package designPatternOf23; /** * 定义:用原型实例,指定创建对象的种类,并通过拷贝这些原型创建新的对象 * P ...

  2. C#设计模式(6)——原型模式(Prototype Pattern)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  3. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...

  4. C#设计模式之六原型模式(Prototype)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  5. C#设计模式之五原型模式(Prototype Pattern)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  6. C#设计模式(6)——原型模式(Prototype Pattern)(转)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  7. C#设计模式(6)——原型模式(Prototype Pattern) C# 深浅复制 MemberwiseClone

    C#设计模式(6)——原型模式(Prototype Pattern)   一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创 ...

  8. JAVA 设计模式之原型模式

    目录 JAVA 设计模式之原型模式 简介 Java实现 1.浅拷贝 2.深拷贝 优缺点说明 1.优点 2.缺点 JAVA 设计模式之原型模式 简介 原型模式是六种创建型设计模式之一,主要应用于创建相同 ...

  9. C# Json反序列化 C# 实现表单的自动化测试<通过程序控制一个网页> 验证码处理类:UnCodebase.cs + BauDuAi 读取验证码的值(并非好的解决方案) 大话设计模式:原型模式 C# 深浅复制 MemberwiseClone

    C# Json反序列化   Json反序列化有两种方式[本人],一种是生成实体的,方便处理大量数据,复杂度稍高,一种是用匿名类写,方便读取数据,较为简单. 使用了Newtonsoft.Json,可以自 ...

  10. GOF23设计模式之原型模式

    GOF23设计模式之原型模式 1)通过 new 产生一个对象需要飞船繁琐的数据准备或访问权限,则可以使用原型模式. 2)就算 java 中的克隆技术,以某个对象为原型,复制出新的对象.显然,新的对象具 ...

随机推荐

  1. python︱模块加载(pip安装)以及pycharm安装与报错解决方式

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 准备放下R开始学python,真是痛苦,因为找 ...

  2. DML触发器1

    数据库触发器是特殊的存储程序.通常不直接调用它们,而是由数据库的事件触发. 触发器分类: >DML触发器 >instead-of触发器 >系统事件触发器,还可以是DDL 一. DML ...

  3. CentOS配置日志集中管理

    ①首先有产生日志的服务器和储存日志的服务器 ②产生.接收日志的服务器都必须安装rsyslog服务(可以通过yum.rpm.源码包安装),rsyslog支持C/S模式 ③日志存储服务器需要编辑rsysl ...

  4. 关于vue如何解决数据渲染完成之前,dom树显示问题

    在id="app"以下的标签中添加属性v-cloak 并且在css文件中添加[v-cloak]{display:none} 如果效果失效,这种原因是有几种可能,游览器大的解析加载速 ...

  5. js中的0就是false,非0就是true及案例

    在处理js代码判断真假时经常会这么写. 但fun()可能得到的是数字0,这可不是表示的没有值,但是!js中的数字0就是false,非0就是true. 于是0就被无情的当做false了. 已经被这个坑过 ...

  6. freemarker中的split字符串分割(十六)

    1.简易说明 split分割:用来根据另外一个字符串的出现将原字符串分割成字符串序列 2.举例说明 <#--freemarker中的split字符串分割--> <#list &quo ...

  7. 【CJOJ P1333】【HNOI2012】矿场搭建

    [HNOI2012]矿场搭建 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖 ...

  8. Spring Boot 文件上传原理

    首先我们要知道什么是Spring Boot,这里简单说一下,Spring Boot可以看作是一个框架中的框架--->集成了各种框架,像security.jpa.data.cloud等等,它无须关 ...

  9. 备库搭建后,进入备库报错psql: FATAL: the database system is starting up

        备库搭建后,进入备库报错psql: FATAL:  the database system is starting up  原因:备库配置文件没有hot_standby = on   mast ...

  10. MongoDB存储引擎(下)——In-Memory

    前两篇文章分别介绍了MMAPv1和WiredTiger,这两个存储引擎都是会将数据持久化存储到硬盘的,除此之外,MongoDB也有只将数据存储在内存的存储引擎,那就是In-Memory. In-Mem ...