第7章 创建型模式—原型模式

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值