0 引言

0.1 目的

       本文档给出设计模式之——Prototype模式的简化诠释,并给出其C++实现

0.2 说明

Project

Design Pattern ExplanationBy K_Eckel

Authorization

Free Distributed but Ownership Reserved

Date

2005-04-05Cherry blossom is Beautiful

Test Bed

MS Visual C++ 6.0

0.3 参考

       在本文档的写作中,参考了以下的资源,在此列出表示感谢:

u       书籍

[GoF 2000]GoF,Design Patterns-Elements of Reusable Object-Oriented Software

Addison-Wesley 2000/9.

        [Martine 2003]Robert C.Martine, Agile Software Development Principles, Patterns, and Practices, Pearson Education, 2003.

0.4 联系作者

Author

K_Eckel

State

Candidate for Master’s Degree School of Computer Wuhan University

E_mail

frwei@whu.edu.cn 

2 Prototype模式

2.1 问题

       关于这个模式,突然想到了小时候看的《西游记》,齐天大圣孙悟空再发飙的时候可以通过自己头上的3根毛立马复制出来成千上万的孙悟空,对付小妖怪很管用(数量最重要)。Prototype模式也正是提供了自我复制的功能,就是说新对象的创建可以通过已有对象进行创建。在C++中拷贝构造函数(Copy Constructor)曾经是很对程序员的噩梦,浅层拷贝和深层拷贝的魔魇也是很多程序员在面试时候的快餐和系统崩溃时候的根源之一。

2.2 模式选择

       Prototype模式典型的结构图为:


2-1Prototype Pattern结构图

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

2.3 实现

2.3.1 完整代码示例(code

       Prototype模式的实现很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用C++实现,并在VC 6.0下测试运行)。

代码片断1Prototype.h
//Prototype.h

#ifndef _PROTOTYPE_H_
#define _PROTOTYPE_H_

class Prototype
{
public:
 virtual ~Prototype();

 virtual Prototype* Clone() const = 0;

protected:
 Prototype();

private:

};

class ConcretePrototype:public Prototype
{
public:
 ConcretePrototype();

 ConcretePrototype(const ConcretePrototype& cp);

 ~ConcretePrototype();

 Prototype* Clone() const;

protected:

private:

};

#endif //~_PROTOTYPE_H_

代码片断2Prototype.cpp
//Prototype.cpp

#include "Prototype.h"
#include <iostream>
using namespace std;

Prototype::Prototype()
{

}

Prototype::~Prototype()
{

}

Prototype* Prototype::Clone() const
{
 return 0;
}

ConcretePrototype::ConcretePrototype()
{

}

ConcretePrototype::~ConcretePrototype()
{

}

ConcretePrototype::ConcretePrototype(const ConcretePrototype& cp)
{
 cout<<"ConcretePrototype copy ..."<<endl;
}

Prototype* ConcretePrototype::Clone() const
{
 return new ConcretePrototype(*this);
}

代码片断3main.cpp
//main.cpp

#include "Prototype.h"

#include <iostream>
using namespace std;

int main(int argc,char* argv[])
{

 Prototype* p = new ConcretePrototype();

 Prototype* p1 = p->Clone();

 return 0;
}

2.3.2 代码说明

Prototype模式的结构和实现都很简单,其关键就是(C++中)拷贝构造函数的实现方

式,这也是C++实现技术层面上的事情。由于在示例代码中不涉及到深层拷贝(主要指有指针、复合对象的情况),因此我们通过编译器提供的默认的拷贝构造函数(按位拷贝)的方式进行实现。说明的是这一切只是为了实现简单起见,也因为本文档的重点不在拷贝构造函数的实现技术,而在Prototype模式本身的思想。

2.4 讨论

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

Posted on 2005-07-08 21:17  k_eckel's mindview  阅读(687)  评论(0编辑  收藏  举报