设计模式:原型模式(C++)【克隆羊多莉】
生活随笔
收集整理的這篇文章主要介紹了
设计模式:原型模式(C++)【克隆羊多莉】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原型模式介紹
這節我們繼續學習設計模式——原型模式。我們先看看原型模式的標準說法,用原型實例指定創建對象的種類并且通過拷貝這些原型創建新的對象。其實原型模式就是從一個對象再創建另外一個可定制的對象,而且不需要知道任何創建的細節而已。
我們先看看C++和其他一些面向對象的編程語言的區別。在java、C# 或者一些其他的面向對象編程語言,他們所有的類都是都會繼承或者間接繼承Object類。比如說java中Object類 有一個clone方法,實現上就是原型模式的體現,子類需要根據情況進行實現罷了。而我們的C++呢 沒有Object(上帝類),所以呢 我們需要在我們自己的原型類中添加一個clone 克隆方法就行了。有人或許會說,C++不是有拷貝構造函數么。確實有默認的拷貝構造函數呀,但是 默認的拷貝構造函數只提供基本的值拷貝,如果有在堆區開辟空間的成員呢?所以我們要提供自己的拷貝構造函數進行深拷貝,方便用戶,還應該提供一個clone方法(實際就是去調用拷貝構造函數)。下面看原型模式克隆羊多莉 案例。
克隆羊多利代碼實現
原型圖就是不畫了吧,就一個類。。。。對外提供clone方法,如果類成員有在堆區開辟空間,需要重新拷貝構造函數進行深拷貝!clone方法本質還是調用拷貝構造函數。注意,我們的析構函數要釋放堆區開辟的內容喲。
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std;class Sheep {friend ostream& operator<<(ostream&, Sheep& sheep); public://構造函數Sheep(char* name,int age){this->age = age;this->name = new char[strlen(name) + 1]{ 0 };strcpy(this->name, name);}//拷貝構造函數Sheep(const Sheep& sheep){this->age = sheep.age;this->name = new char[strlen(sheep.name) + 1]{ 0 };strcpy(this->name, sheep.name);}~Sheep(){if (name != NULL){delete name;}}//重載 = 賦值運算符Sheep& operator=(const Sheep& sheep){//1、防止自身賦值if (this == &sheep){return *this;}//2、釋放原來在堆空間開辟的空間if (this->name != NULL){delete this->name;this->name = NULL;}//3、執行深拷貝this->age = sheep.age;this->name = new char[strlen(sheep.name) + 1]{ 0 };strcpy(this->name, sheep.name);}Sheep* clone(){//直接調用 拷貝構造函數,因為拷貝構造函數已經做了深拷貝的動作。return new Sheep(*this);}char* getName(){return name;}void setName(char* name){if (this->name != NULL){delete this->name;this->name = NULL;}this->name = new char[strlen(name) + 1]{ 0 };strcpy(this->name, name);}int getAge(){return age;}void setAge(int age){this->age = age;} private:char* name;int age; }; //重載<<運算符 ostream& operator<<(ostream&, Sheep& sheep) {cout << "[name = " << sheep.name << " ,age = "<< sheep.age << "]";return cout; }int main(int argc, char *argv[]) {Sheep* sheep1 = new Sheep("多利",0);Sheep* sheep2 = sheep1->clone();cout << "sheep1:" << *sheep1 << endl;cout << "sheep2:" << *sheep2 << endl;cout << "刪除克隆原型sheep1" << endl;delete sheep1;cout << "sheep2:" << *sheep2 << endl;return EXIT_SUCCESS; }運行結果
總結
以上是生活随笔為你收集整理的设计模式:原型模式(C++)【克隆羊多莉】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C 语言的io流
- 下一篇: s3c2440移植MQTT