首页 > 其他分享 >设计模式-原型模式

设计模式-原型模式

时间:2023-02-19 14:23:55浏览次数:33  
标签:p2 customerName string HomeOrder 模式 原型 设计模式 order productId

原型模式(Prototype Pattern):

使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式

应用实例

描述如下:
image

未使用原型模式

#include<iostream>
#include<string>
#include<sstream>



using namespace std;


template<class T>
string ConvertToString(T value) {

	stringstream ss;
	ss << value;
	return ss.str();
}





class OrderApi {

public:

	virtual int getOrderNum() { return m_orderProductNum; };
	virtual void setOrderNum(int num) { m_orderProductNum = num; };
	virtual string getOrderContent() = 0;

protected:
	OrderApi() {};
	int m_orderProductNum;
};


class HomeOrder : public OrderApi {

public:
	
	
	virtual string getOrderContent() {
		
		return "客户是:" + m_customerName + "  订单的数量:" + ConvertToString<int>(m_orderProductNum) + "  订单id:" + m_productId;

	}

	void setCustomName(string name) {
		m_customerName = name;
	}

	string getCustomName() { return m_customerName; };


	void setId(string id) {
		m_productId = id;
	}

	string getId() { return m_productId; };

private:
	string m_customerName;
	string m_productId;
	
};




class AboardOrder : public OrderApi {

public:


	virtual string getOrderContent() {

		return "客户是:" + m_customerName + "  订单的数量:" + ConvertToString<int>(m_orderProductNum) + "  订单id:" + m_productId;

	}

	void setCustomName(string name) {
		m_customerName = name;
	}

	string getCustomName() { return m_customerName; };


	void setId(string id) {
		m_productId = id;
	}

	string getId() { return m_productId; };

private:
	string m_customerName;
	string m_productId;

};


class OrderBusiness {

public:
	void saveOrder(OrderApi* order);

};


void OrderBusiness::saveOrder(OrderApi* order) {

	while (order->getOrderNum() > 200)
	{
		OrderApi* neworder = nullptr;
		if (dynamic_cast<HomeOrder*>(order)!= nullptr)
		{
			HomeOrder* p2 = new HomeOrder;
			HomeOrder* p1 = static_cast<HomeOrder*>(order);
			p2->setOrderNum(200);
			p2->setCustomName(p1->getCustomName());
			p2->setId(p1->getId());
			neworder = p2;
		}

		if (dynamic_cast<AboardOrder*>(order) != nullptr)
		{
			HomeOrder* p2 = new HomeOrder;
			HomeOrder* p1 = static_cast<HomeOrder*>(order);
			p2->setOrderNum(200);
			p2->setCustomName(p1->getCustomName());
			p2->setId(p1->getId());
			neworder = p2;
		}

		//原来的订单更新数量
		order->setOrderNum(order->getOrderNum() - 200);
		cout << "New Order:" << neworder->getOrderContent() << endl;

	}

	cout << "Order:" << order->getOrderContent() << endl;

}

int main(void) {

	//system("killtask /m prototype.exe");
	
	HomeOrder* home = new HomeOrder();
	home->setOrderNum(512);
	home->setCustomName("zj");
	home->setId("c++");
	
	OrderBusiness* obj = new OrderBusiness;
	obj->saveOrder(home);
	
	
	return 0;
}

使用原型模式


#include<iostream>
#include<string>
#include<sstream>



using namespace std;


template<class T>
string ConvertToString(T value) {

	stringstream ss;
	ss << value;
	return ss.str();
}





class OrderApi {

public:

	virtual int getOrderNum() { return m_orderProductNum; };
	virtual void setOrderNum(int num) { m_orderProductNum = num; };
	virtual string getOrderContent() = 0;
	virtual OrderApi* cloneOrder() = 0;
protected:
	OrderApi() {};
	int m_orderProductNum;
};


class HomeOrder : public OrderApi {

public:


	virtual string getOrderContent() {

		return "客户是:" + m_customerName + "  订单的数量:" + ConvertToString<int>(m_orderProductNum) + "  订单id:" + m_productId;

	}

	void setCustomName(string name) {
		m_customerName = name;
	}

	string getCustomName() { return m_customerName; };


	void setId(string id) {
		m_productId = id;
	}

	string getId() { return m_productId; };

	virtual OrderApi* cloneOrder() {

		HomeOrder* p2 = new HomeOrder;
		p2->setOrderNum(200);
		p2->setCustomName(m_customerName);
		p2->setId(m_productId);
		return p2;
	}

private:
	string m_customerName;
	string m_productId;

};




class AboardOrder : public OrderApi {

public:


	virtual string getOrderContent() {

		return "客户是:" + m_customerName + "  订单的数量:" + ConvertToString<int>(m_orderProductNum) + "  订单id:" + m_productId;

	}

	void setCustomName(string name) {
		m_customerName = name;
	}

	string getCustomName() { return m_customerName; };


	void setId(string id) {
		m_productId = id;
	}

	string getId() { return m_productId; };

private:
	string m_customerName;
	string m_productId;

};


class OrderBusiness {

public:
	void saveOrder(OrderApi* order);

};


void OrderBusiness::saveOrder(OrderApi* order) {

	while (order->getOrderNum() > 200)
	{
		OrderApi* neworder = nullptr;
		if (dynamic_cast<HomeOrder*>(order) != nullptr)
		{
			HomeOrder* p2 = new HomeOrder;
			HomeOrder* p1 = static_cast<HomeOrder*>(order);
			p2->setOrderNum(200);
			p2->setCustomName(p1->getCustomName());
			p2->setId(p1->getId());
			neworder = p2;
		}

		if (dynamic_cast<AboardOrder*>(order) != nullptr)
		{
			HomeOrder* p2 = new HomeOrder;
			HomeOrder* p1 = static_cast<HomeOrder*>(order);
			p2->setOrderNum(200);
			p2->setCustomName(p1->getCustomName());
			p2->setId(p1->getId());
			neworder = p2;
		}

		//原来的订单更新数量
		order->setOrderNum(order->getOrderNum() - 200);
		cout << "New Order:" << neworder->getOrderContent() << endl;

	}

	cout << "Order:" << order->getOrderContent() << endl;

}

int main(void) {

	//system("KILLTASK /M Prototype.exe");

	HomeOrder* home = new HomeOrder();
	home->setOrderNum(512);
	home->setCustomName("ZJ");
	home->setId("C++");

	OrderBusiness* obj = new OrderBusiness;
	obj->saveOrder(home);


	return 0;
}

总结

image

标签:p2,customerName,string,HomeOrder,模式,原型,设计模式,order,productId
From: https://www.cnblogs.com/xcodingfork/p/17134677.html

相关文章

  • 设计模式-建造者模式
    业务场景未使用建造者模式实现#include<iostream>#include<string>#include<vector>#include<sstream>usingnamespacestd;template<classT>stringConvertTo......
  • 原型链的问题
    1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<title>原型链的问题</title>6</head>7<body>89<script>10......
  • 简单工厂模式
     packagecom.mhm.simplefactory;/****@authorAdministrator*@描述抽象产品角色*/publicinterfaceCar{publicvoiddrive();}packagecom.mhm.simplefactory......
  • 软件测试|测试开发之路--UI 自动化常用设计模式
    接上一次的帖子,今天讲一下我再UI自动化中常用的设计模式。由于网上已经有非常多的文章详细讲解了设计模式的编码实现,所以我今天也就不讲实现细节了。就是讲我也讲不出什......
  • php 运用设计模式:观察者模式,设计电商平台支付成功程序|Github仓库
    前(fei)言(hua)在支付程序中,大型项目的维护,如果没有运用到设计模式,面向过程的编程,order程序会日益增加,程序看上去杂乱无章,今天写了一个小demo,之前没有运用过观察者模式的小伙......
  • 访问者模式
    解耦数据结构和数据三种角色访问者IPeople:对数据结构的访问被访问者IMoney:被访问的数据结构容器BankContainer:用于装载数据结构,提供方法接受访问者访问所有的数据结......
  • Python实现单例模式
    Python实现单例模式有两种方法:一种是通过静态变量方法实现单例模式;另一种是通过装饰器实现单例模式。具体实现代码如下:#方法一:静态变量方法实现单例模式。#1.构造方法私有......
  • 微软出品自动化神器【Playwright+Java】系列(九)多线程、重定向、弹出新窗口、截图、新
    写在前面关于Playwright系列的文章,真的很久没有写了,今天一个不小心官方API部分过完了,下面将为大家逐一演示,感兴趣的同学可以自行动手练习。API部分多线程直白点说就是......
  • 嵌入式ARM设计编程(三) 处理器工作模式
    文章和代码已归档至【Github仓库:​​hardware-tutorial​​】,需要的朋友们自取。或者关注公众号【AIShareLab】,回复嵌入式也可获取。一、实验目的(1)通过实验掌握学会使用m......
  • ZMQ之脱机可靠性--巨人模式
      当你意识到管家模式是一种非常可靠的消息代理时,你可能会想要使用磁盘做一下消息中转,从而进一步提升可靠性。这种方式虽然在很多企业级消息系统中应用,但我还是有些反对的......