解析设计模式中的Prototype原型模式及在C++中的使用_C 语言

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

适用性 
当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者
为了避免创建一个与产品类层次平行的工厂类层次时;或者
当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

关于这个模式,突然想到了小时候看的《西游记》,齐天大圣孙悟空再发飙的时候可以通过自己头上的 3 根毛立马复制出来成千上万的孙悟空,对付小妖怪很管用(数量最重要)。

原型模式也正是提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建。在 C++中拷贝构造函数(Copy Constructor)曾经是很对程序员的噩梦,浅层拷贝和深层拷贝的魔魇也是很多程序员在面试时候的快餐和系统崩溃时候的根源之一。

结构图:

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

例子
注意事项:
(1)根据原型模式的UML图可以知道,实现要依赖于抽象要不要依赖与具体
(2)拷贝构造函数是核心,而且针对c++要进行的是深拷贝
(3)克隆函数的关键就是调用拷贝构造函数

#include <iostream>
using namespace std; 

class Student
{
protected:
  int id;
  char name[10]; 

public:
  Student()
  {
  }
  ~Student()
  {
    cout<<"Desconstuct...."<<endl;
  } 

  virtual Student *Clone()
  {} 

  virtual void Show()
  { }
}; 

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("fulima");
  Student *student2 = student1->Clone();
  Student *student3 = student2->Clone();   

  student1->Show();
  student2->Show();
  student3->Show();   

  return 0;
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, 设计模式
原型模式
prototype原型链、原型prototype、prototype js原型、prototype 语言学、prototype模式,以便于您获取更多的相关知识。

时间: 2016-03-09

解析设计模式中的Prototype原型模式及在C++中的使用_C 语言的相关文章

java设计模式---prototype(原型)模式

设计 java设计模式---prototype(原型)模式 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.      Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,      工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求      原型对象拷贝它们自己来实施创建.      适用性:当要实例化的类是在运行时刻指定时,例如,通过动态装载:或者  为了避免创建一个与产品类层次平行的工厂类层

设计模式(四)原型模式Prototype(创建型)

设计模式(四)原型模式Prototype  1.   概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象. 例子1:孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递下面是一个邮寄快递的场景:"给我寄个快递."顾客说."寄往什么地方?寄给--?"你问.&qu

php设计模式 Prototype (原型模式)代码

复制代码 代码如下:<?php /** * 原型模式 * * 用原型实例指定创建对象的种类.并且通过拷贝这个原型来创建新的对象 * */ abstract class Prototype { private $_id = null; public function __construct($id) { $this->_id = $id; } public function getID() { return $this->_id; } public function __clone() /

JavaScript中的prototype(原型)属性研究

javascript 我们知道Jscript中对象的prototype属性,是用来返回对象类型原型的引用的.我们使用prototype属性提供对象的类的一组基本功能.并且对象的新实例会"继承"赋予该对象原型的操作.但是这个prototype到底是怎么实现和被管理的呢? 对于对象的prototype属性的说明,Jscript手册上如是说:所有 Jscript 内部对象都有只读的 prototype 属性.可以向其原型中动态添加功能(属性和方法),但该对象不能被赋予不同的原型.然而,用户定

Java设计模式(五)----原型模式

原型模式(Prototype) 一.概述 二.结构 三.浅度克隆和深度克隆 浅度克隆 深度克隆 一.概述 定义:原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.简言之:就是复制粘贴.这就是选型模式的用意. 二.结构 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype.Prototype类需要具备以下两个条件: 1.实现Cloneable接口.在java语言有一个Cloneable接口,它的作用

JavaScript中的prototype原型学习指南_基础知识

原型是什么 Function 类型有一个属性 prototype,直接翻译过来就是原型.这个属性就是一个指针,指向一个对象,这个对象包含一些属性和方法,这些属性和方法会被当前函数生成的所有实例(对象)所共享. 这句话根据前面所说的,细细琢磨下来,就可以得到下面代码: function Person(){ ... } Person.prototype = { country : 'china', sayName : function(){ ... } } 先创建了一个 Function 类型的实例

设计模式详解之原型模式

原型模式(Prototype): 原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.本小结会通过对象的复制,进行讲解.在Java中,复制对象是通过clone()实现的,先创建一个原型类: public class Prototype implements Cloneable { public Object clone() throws CloneNotSupportedException {

php Prototype原型模式学习笔记

待解决的问题:我们能否减少new的使用,同时避免需要新增对象的时候,了解对象的类名. 思路:php5提供了克隆方法,我们可以新增一个对象,然后每次需要新增和她同类的对象,克隆他就可以了. 原型(Prototype)模式示例:  代码如下 复制代码 <?php //机兵类 class Marine {   //所属的用户ID   public $playerID   //构造函数,参数为用户的id   public function __construct($id)   {   $this->p

剖析C++编程中friend关键字所修饰的友元函数和友元类_C 语言

在某些情况下,为不是类成员的函数或单独类中的所有函数授予成员级别的访问权会更方便.仅类实现器可以声明其友元.函数或类不能将其自身声明为任何类的友元.在类声明中,使用 friend 关键字和非成员函数名称或其他类,以允许其访问你的类的专用和受保护成员.语法 friend class-name; friend function-declarator; 友元声明如果声明以前未声明的友元函数,则该函数将被导出到封闭非类范围. 友元声明中声明的函数被视为已使用 extern 关键字声明.(有关 exter