實(shí)例講解C++編程中對(duì)設(shè)計(jì)模式中的原型模式的使用
原型模式的實(shí)現(xiàn)完整代碼示例(code):原型模式的實(shí)現(xiàn)很簡(jiǎn)單,這里為了方便初學(xué)者的學(xué)習(xí)和參考,將給出完整的實(shí)現(xiàn)代碼(所有代碼采用 C++實(shí)現(xiàn),并在 VC 6.0 下測(cè)試運(yùn)行)。
代碼片斷 1:Prototype.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_
代碼片斷 2:Prototype.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);
}
代碼片斷 3:main.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;
}
代碼說(shuō)明:原型模式的結(jié)構(gòu)和實(shí)現(xiàn)都很簡(jiǎn)單,其關(guān)鍵就是(C++中)拷貝構(gòu)造函數(shù)的實(shí)現(xiàn)方式,這也是 C++實(shí)現(xiàn)技術(shù)層面上的事情。由于在示例代碼中不涉及到深層拷貝(主要指有指針、復(fù)合對(duì)象的情況),因此我們通過(guò)編譯器提供的默認(rèn)的拷貝構(gòu)造函數(shù)(按位拷貝)的方式進(jìn)行實(shí)現(xiàn)。說(shuō)明的是這一切只是為了實(shí)現(xiàn)簡(jiǎn)單起見(jiàn),也因?yàn)楸疚臋n的重點(diǎn)不在拷貝構(gòu)造函數(shù)的實(shí)現(xiàn)技術(shù),而在原型模式本身的思想。
另一個(gè)實(shí)例
我們?cè)賮?lái)看一個(gè)具體項(xiàng)目的例子:
namespace Prototype_DesignPattern
{
using System;
// Objects which are to work as prototypes must be based on classes which
// are derived from the abstract prototype class
abstract class AbstractPrototype
{
abstract public AbstractPrototype CloneYourself();
}
// This is a sample object
class MyPrototype : AbstractPrototype
{
override public AbstractPrototype CloneYourself()
{
return ((AbstractPrototype)MemberwiseClone());
}
// lots of other functions go here!
}
// This is the client piece of code which instantiate objects
// based on a prototype.
class Demo
{
private AbstractPrototype internalPrototype;
public void SetPrototype(AbstractPrototype thePrototype)
{
internalPrototype = thePrototype;
}
public void SomeImportantOperation()
{
// During Some important operation, imagine we need
// to instantiate an object - but we do not know which. We use
// the predefined prototype object, and ask it to clone itself.
AbstractPrototype x;
x = internalPrototype.CloneYourself();
// now we have two instances of the class which as as a prototype
}
}
/// <summary>
/// Summary description for Client.
/// </summary>
public class Client
{
public static int Main(string[] args)
{
Demo demo = new Demo();
MyPrototype clientPrototype = new MyPrototype();
demo.SetPrototype(clientPrototype);
demo.SomeImportantOperation();
return 0;
}
}
}
C#對(duì)原型模式的支持
在C#里面,我們可以很容易的通過(guò)Clone()方法實(shí)現(xiàn)原型模式。任何類,只要想支持克隆,必須實(shí)現(xiàn)C#中的ICloneable接口。ICloneable接口中有一Clone方法,可以在類中復(fù)寫(xiě)實(shí)現(xiàn)自定義的克隆方法??寺〉膶?shí)現(xiàn)方法有兩種:淺拷貝(shallow copy)與深拷貝(deep copy)。
淺拷貝與深拷貝
下面給出淺拷貝與深拷貝的兩個(gè)例子,例子使用了ICloneable接口。C#中的數(shù)組是引用型的變量,我們通過(guò)數(shù)組來(lái)進(jìn)行演示:
淺拷貝:
using System;
class ShallowCopy : ICloneable
{
public int[] v = {1,2,3};
public Object Clone()
{
return this.MemberwiseClone();
}
public void Display()
{
foreach(int i in v)
Console.Write( i + ", ");
Console.WriteLine();
}
}
class Client
{
public static void Main()
{
ShallowCopy sc1 = new ShallowCopy();
ShallowCopy sc2 = (ShallowCopy)sc1.Clone();
sc1.v[0] = 9;
sc1.Display();
sc2.Display();
}
}
ShallowCopy對(duì)象實(shí)現(xiàn)了一個(gè)淺拷貝,因此當(dāng)對(duì)sc1進(jìn)行克隆時(shí),其字段v并沒(méi)有克隆,這導(dǎo)致sc1與sc2的字段v都指向了同一個(gè)v,因此,當(dāng)修改了sc1的v[0]后,sc2的v[0]也發(fā)生了變化。
深拷貝:
using System;
class DeepCopy : ICloneable
{
public int[] v = {1,2,3};
// 默認(rèn)構(gòu)造函數(shù)
public DeepCopy()
{
}
// 供Clone方法調(diào)用的私有構(gòu)造函數(shù)
private DeepCopy(int[] v)
{
this.v = (int[])v.Clone();
}
public Object Clone()
{
// 構(gòu)造一個(gè)新的DeepCopy對(duì)象,構(gòu)造參數(shù)為
// 原有對(duì)象中使用的 v
return new DeepCopy(this.v);
}
public void Display()
{
foreach(int i in v)
Console.Write( i + ", ");
Console.WriteLine();
}
}
class Client
{
public static void Main()
{
DeepCopy dc1 = new DeepCopy();
DeepCopy dc2 = (DeepCopy)dc1.Clone();
dc1.v[0] = 9;
dc1.Display();
dc2.Display();
}
}
關(guān)于原型模式的討論
原型模式通過(guò)復(fù)制原型(原型)而獲得新對(duì)象創(chuàng)建的功能,這里原型本身就是"對(duì)象工廠"(因?yàn)槟軌蛏a(chǎn)對(duì)象),實(shí)際上原型模式和 Builder 模式、AbstractFactory 模式都是通過(guò)一個(gè)類(對(duì)象實(shí)例)來(lái)專門(mén)負(fù)責(zé)對(duì)象的創(chuàng)建工作(工廠對(duì)象),它們之間的區(qū)別是: Builder 模式重在復(fù)雜對(duì)象的一步步創(chuàng)建(并不直接返回對(duì)象),AbstractFactory 模式重在產(chǎn)生多個(gè)相互依賴類的對(duì)象,而原型模式重在從自身復(fù)制自己創(chuàng)建新類。
- 全面解析設(shè)計(jì)模式中的建造者模式及相關(guān)C++實(shí)現(xiàn)
- C++設(shè)計(jì)模式編程中Facade外觀模式的使用實(shí)例解析
- 通過(guò)C++程序示例理解設(shè)計(jì)模式中的外觀模式
- C++設(shè)計(jì)模式編程中Template Method模板方法模式的運(yùn)用
- 詳解設(shè)計(jì)模式中的模板方法模式及在C++中的使用
- 解析設(shè)計(jì)模式中的Prototype原型模式及在C++中的使用
- C++設(shè)計(jì)模式編程中proxy代理模式的使用實(shí)例
- 淺析設(shè)計(jì)模式中的代理模式在C++編程中的運(yùn)用
- C++編程中使用設(shè)計(jì)模式中的policy策略模式的實(shí)例講解
- 詳解C++設(shè)計(jì)模式編程中對(duì)狀態(tài)模式的運(yùn)用
相關(guān)文章
C語(yǔ)言關(guān)于自定義數(shù)據(jù)類型之枚舉和聯(lián)合體詳解
枚舉顧名思義就是把所有的可能性列舉出來(lái),像一個(gè)星期分為七天我們就可以使用枚舉,聯(lián)合體是由關(guān)鍵字union和標(biāo)簽定義的,和枚舉是一樣的定義方式,不一樣的是,一個(gè)聯(lián)合體只有一塊內(nèi)存空間,什么意思呢,就相當(dāng)于只開(kāi)辟最大的變量的內(nèi)存,其他的變量都在那個(gè)變量占據(jù)空間2021-11-11
C語(yǔ)言之字符串模糊查詢方法的實(shí)現(xiàn)
本篇文章主要為大家介紹字符串模糊查詢的C語(yǔ)言程序編寫(xiě)方法,有需要的朋友可以參考下2015-07-07
tinyxml 常用的C++ XML解析器非常優(yōu)秀
讀取和設(shè)置xml配置文件是最常用的操作,試用了幾個(gè)C++的XML解析器,個(gè)人感覺(jué)TinyXML是使用起來(lái)最舒服的,因?yàn)樗腁PI接口和Java的十分類似,面向?qū)ο笮院芎?/div> 2012-11-11
C++字符數(shù)組的輸入輸出和字符串結(jié)束標(biāo)志使用講解
這篇文章主要介紹了C++字符數(shù)組的輸入輸出和符串結(jié)束標(biāo)志使用講解,是C++入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
學(xué)好C++必須做到的50條 絕對(duì)經(jīng)典!
學(xué)好C++必須做到的50條,絕對(duì)經(jīng)典!想要學(xué)好C++的朋友一定要認(rèn)真閱讀本文,更要做到以下50條2016-09-09
C語(yǔ)言詳解實(shí)現(xiàn)猜數(shù)字游戲步驟
猜數(shù)字是興起于英國(guó)的益智類小游戲,起源于20世紀(jì)中期,一般由兩個(gè)人或多人玩,也可以由一個(gè)人和電腦玩。游戲規(guī)則為一方出數(shù)字,一方猜,今天我們來(lái)實(shí)現(xiàn)這個(gè)游戲案例2022-07-07最新評(píng)論

