写好的代码就是为了以后少写一些代码。
西游记中的孙悟空神通广大,拔一根毫毛喊一声:变。一个新的孙悟空就出来了,编程的时候经常也需要用到这个技能。不过程序中的孙悟空比西游记中的孙悟空更牛X,它还能再拔毛变悟空,而西游记中的就没有这个神技了。
C++示例代码:
// 孙悟空.h
#pragma once
class 孙悟空
{
public:
孙悟空();
virtual ~孙悟空();
virtual 孙悟空* 拔毫毛喊变() = 0;
virtual void 报名号() = 0;
};
// 孙悟空.cpp
#include "stdafx.h"
#include "孙悟空.h"
孙悟空::孙悟空()
{
}
孙悟空::~孙悟空()
{
}
// 本体.h
#pragma once
#include "孙悟空.h"
#include <string>
using namespace std;
class 本体 :
public 孙悟空
{
public:
本体(const 本体& bt);
本体(string 地址, string 美名, string 封号, string 名称);
virtual ~本体();
孙悟空* 拔毫毛喊变();
void 报名号();
private:
string 地址;
string 美名;
string 封号;
string 名称;
};
// 本体.cpp
#include "stdafx.h"
#include "本体.h"
#include <iostream>
using namespace std;
本体::本体(string 地址, string 美名, string 封号, string 名称)
{
this->地址 = 地址;
this->美名 = 美名;
this->封号 = 封号;
this->名称 = 名称;
}
本体::~本体()
{
}
孙悟空* 本体::拔毫毛喊变()
{
return new 本体(地址, 美名, 封号, 名称);
}
void 本体::报名号()
{
cout << "俺乃" << 地址 << 美名 << 封号 << 名称 << endl;
}
// 原型模式.cpp
// 原型模式.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "孙悟空.h"
#include "本体.h"
#include <iostream>
#include <list>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
孙悟空* swk = new 本体("花果山水帘洞", "美猴王", "齐天大圣", "孙悟空");
swk->报名号();
list<孙悟空 *> swks;
for (int i = 0; i < 10; i++)
{
swks.push_back(swk->拔毫毛喊变());
}
for (list<孙悟空*>::iterator it = swks.begin(); it != swks.end(); it++)
{
(*it)->报名号();
delete (*it);
(*it) = nullptr;
}
swk->报名号();
cout << "哈哈, 本体和毫毛变的悟空完全一样,谁能分的清楚!!!" << endl;
swks.clear();
delete swk;
swk = nullptr;
// 唯一不同的是孙悟空毫毛变的孙悟空不能再拔毫毛变孙悟空了,
// 而我们的原型模式创建的孙悟空可以再变孙悟空。
getchar();
return 0;
}
C#代码示例:
/*
* 由SharpDevelop创建。
* 用户: hangba
* 日期: 2016/3/8
* 时间: 10:40
*
* 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
*/
using System;
namespace 原型模式
{
/// <summary>
/// Description of 孙悟空.
/// </summary>
public interface 孙悟空
{
孙悟空 拔毫毛喊变();
void 报名号();
}
}
/*
* 由SharpDevelop创建。
* 用户: hangba
* 日期: 2016/3/8
* 时间: 10:42
*
* 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
*/
using System;
namespace 原型模式
{
/// <summary>
/// Description of 本体.
/// </summary>
public class 本体 : 孙悟空
{
public 本体(string 地址, string 美名, string 封号, string 姓名)
{
this.地址 = 地址;
this.封号 = 封号;
this.美名 = 美名;
this.姓名 = 姓名;
}
public 孙悟空 拔毫毛喊变()
{
return new 本体(地址, 美名, 封号, 姓名);
}
public void 报名号()
{
Console.WriteLine("俺乃{0}{1}{2}{3}", 姓名, 美名, 封号, 姓名);
}
private string 地址;
private string 美名;
private string 封号;
private string 姓名;
}
}
/*
* 由SharpDevelop创建。
* 用户: hangba
* 日期: 2016/3/8
* 时间: 10:25
*
* 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
*/
using System;
namespace 原型模式
{
class Program
{
public static void Main(string[] args)
{
孙悟空 wk = new 本体("花果山水帘洞", "美猴王", "齐天大圣", "孙悟空");
wk.报名号();
孙悟空[] haomao = new 孙悟空[10];
for (int i = 0; i < 10; i++)
{
haomao[i] = wk.拔毫毛喊变();
}
foreach (孙悟空 hm in haomao) {
hm.报名号();
}
Console.WriteLine("谁能分出来哪个是初始的孙悟空?");
孙悟空 sunzi = haomao[0].拔毫毛喊变();
sunzi.报名号();
Console.WriteLine("毫毛变的孙悟空也能拔毫毛变孙悟空。");
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
C#和C++中还区分深拷贝和浅拷贝,本示例代码全部是深拷贝,只是为了演示原型模式。根据需求来实现深拷贝和浅拷贝的应用。