原型模式

写好的代码就是为了以后少写一些代码。

西游记中的孙悟空神通广大,拔一根毫毛喊一声:变。一个新的孙悟空就出来了,编程的时候经常也需要用到这个技能。不过程序中的孙悟空比西游记中的孙悟空更牛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++中还区分深拷贝和浅拷贝,本示例代码全部是深拷贝,只是为了演示原型模式。根据需求来实现深拷贝和浅拷贝的应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值