1. 原型模式(Prototype pattern)的定义
(1)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
①通过克隆来创建新的对象实例
②新的对象实例复制原型实例属性的值
(2)原型模式的结构和说明
①Prototype:声明一个克隆自身的接口,用来约束想要克隆自己的类,要求他们都要实现这里定义的克隆方法。
②ConcretePrototype:实现Prototype接口的类,这些类真正实现了隆自身的功能。
③Client:使用原型的客户端,首先要获取到原型实例对象,然后通过原型实例的克隆自身来创建新的对象实例。
(3)思考原型模式
①原型模型的本质:克隆生成对象
②原型模式可以用来解决“只知接口而不知实现的问题”,出现一种“接口造接口”的假象。
③原型模式的重心还是在创建新的对象实例。至于创建出来的对象,其属性的值是否一定要和原型对象完全一样,这并没有强制规定,但一般会拷贝成一样的。
④通过克隆出来实例是原型实例是两个完全独立的实例,他们之间没有关联。
【编程实验】订单拆分处理
//创建型模式:原型模式
//订单处理:
/*
功能需求:因每个工作小组的处理能力上限是1000,现要求每当订单预定产品数量超过1000时,
把订单拆分为两份来保存,如果还是超过1000,那就继续拆分,直到不超过1000.
*/
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
//*************************辅助类:************************
//定义产品原型的接口,这个产品是为了演示深拷贝
class ProductPrototype
{
public:
virtual ProductPrototype* clone() = 0;
};
class Product :public ProductPrototype
{
private:
string productId; //产品编号
string name; //产品名称
public:
string& getName(){return name;}
void setName(string name){this->name = name;}
string& getProductId(){return productId;}
void setProductId(string productId){this->productId = productId;}
string toString()
{
return "ProductId="+productId+", productName="+name;
}
//克隆方法
ProductPrototype* clone()
{
//创建一个新的订单,然后把本实例的数据复制过去
Product* product = new Product();
product->setProductId(productId);
product->setName(name);
return product;
}
};
//*************************订单原型**************************
//订单的接口,声明了可以克隆自身的方法
class OrderApi
{
public:
virtual string toString() = 0;
virtual int getOrderProductNum()=0;
virtual void setOrderProductN