程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 實例講授C++編程中對設計形式中的原型形式的應用

實例講授C++編程中對設計形式中的原型形式的應用

編輯:關於C++

實例講授C++編程中對設計形式中的原型形式的應用。本站提示廣大學習愛好者:(實例講授C++編程中對設計形式中的原型形式的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是實例講授C++編程中對設計形式中的原型形式的應用正文


原型形式的完成完全代碼示例(code):原型形式的完成很簡略,這裡為了便利初學者的進修和參考,將給出完全的完成代碼(一切代碼采取 C++完成,並在 VC 6.0 下測試運轉)。

代碼片段 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;
}

代碼解釋:原型形式的構造和完成都很簡略,其症結就是(C++中)拷貝結構函數的完成方法,這也是 C++完成技巧層面上的工作。因為在示例代碼中不觸及到深層拷貝(重要指有指針、復合對象的情形),是以我們經由過程編譯器供給的默許的拷貝結構函數(按位拷貝)的方法停止完成。解釋的是這一切只是為了完成簡略起見,也由於本文檔的重點不在拷貝結構函數的完成技巧,而在原型形式自己的思惟。

另外一個實例

我們再來看一個詳細項目標例子:

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#對原型形式的支撐

在C#外面,我們可以很輕易的經由過程Clone()辦法完成原型形式。任何類,只需想支撐克隆,必需完成C#中的ICloneable接口。ICloneable接口中有一Clone辦法,可以在類中復寫完成自界說的克隆辦法。克隆的完成辦法有兩種:淺拷貝(shallow copy)與深拷貝(deep copy)。
淺拷貝與深拷貝

上面給出淺拷貝與深拷貝的兩個例子,例子應用了ICloneable接口。C#中的數組是援用型的變量,我們經由過程數組來停止演示:

淺拷貝:

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對象完成了一個淺拷貝,是以當對sc1停止克隆時,其字段v並沒有克隆,這招致sc1與sc2的字段v都指向了統一個v,是以,當修正了sc1的v[0]後,sc2的v[0]也產生了變更。

深拷貝:

using System;

class DeepCopy : ICloneable
{
 public int[] v = {1,2,3};

 // 默許結構函數
 public DeepCopy()
 {
 }

 // 供Clone辦法挪用的公有結構函數
 private DeepCopy(int[] v)
 {
 this.v = (int[])v.Clone();
 }

 public Object Clone()
 {
 // 結構一個新的DeepCopy對象,結構參數為
 // 原有對象中應用的 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();
 }
}

關於原型形式的評論辯論

原型形式經由過程復制原型(原型)而取得新對象創立的功效,這裡原型自己就是"對象工場"(由於可以或許臨盆對象),現實上原型形式和 Builder 形式、AbstractFactory 形式都是經由過程一個類(對象實例)來專門擔任對象的創立任務(工場對象),它們之間的差別是: Builder 形式重在龐雜對象的一步步創立(其實不直接前往對象),AbstractFactory 形式重在發生多個互相依附類的對象,而原型形式重在從本身復制本身創立新類。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved