场景:订单拆分1000份,然后还有两种订单:个人和公司的。

1. 常规解决

/*** 订单的接口*/
public interface OrderApi {/*** 获取订单产品数量* @return 订单中产品数量*/public int getOrderProductNum();/*** 设置订单产品数量* @param num 订单产品数量*/public void setOrderProductNum(int num);
}/*** 企业订单对象*/
public class EnterpriseOrder implements OrderApi{ private int orderProductNum = 0;public int getOrderProductNum() {return this.orderProductNum;}   public void setOrderProductNum(int num) {this.orderProductNum = num;}   public String toString(){return "本企业订单的订购企业是="+this.enterpriseName+",订购产品是="+this.productId+",订购数量为="+this.orderProductNum;}
}public class OrderBusiness { public void saveOrder(OrderApi order){//1:判断当前的预定产品数量是否大于1000while(order.getOrderProductNum() > 1000){ //2.1再新建一份订单,跟传入的订单除了数量不一样外,其他都相同OrderApi newOrder = null;if(order instanceof PersonalOrder){//创建相应的新的订单对象PersonalOrder p2 = new PersonalOrder();//然后进行赋值,但是产品数量为1000PersonalOrder p1 = (PersonalOrder)order; p2.setOrderProductNum(1000);//然后再设置给newOrdernewOrder = p2;}else if(order instanceof EnterpriseOrder){ }            //2.2原来的订单保留,把数量设置成减少1000order.setOrderProductNum(order.getOrderProductNum()-1000);
}public static void main(String[] args) {//创建订单对象,这里为了演示简单,直接new了PersonalOrder op = new PersonalOrder();//设置订单数据op.setOrderProductNum(2925);//这里获取业务处理的类,也直接new了,为了简单,连业务接口都没有做OrderBusiness ob = new OrderBusiness(); ob.saveOrder(op);}

2. 原型模式

public interface Prototype {/*** 克隆自身的方法* @return 一个从自身克隆出来的对象*/public Prototype clone();
}public class ConcretePrototype1 implements Prototype {public Prototype clone() {//最简单的克隆,新建一个自身对象,由于没有属性,就不去复制值了Prototype prototype = new ConcretePrototype1();return prototype;}
}public class Client { private Prototype prototype; public Client(Prototype prototype){this.prototype = prototype;} public void operation(){//会需要创建原型接口的对象Prototype newPrototype = prototype.clone();}

3. 改写示例

public interface OrderApi { public int getOrderProductNum(); public void setOrderProductNum(int num); public OrderApi cloneOrder();
}public class PersonalOrder implements OrderApi{// 订购人员姓名private String customerName;private int orderProductNum = 0;public String getCustomerName() {return customerName;}public void setCustomerName(String customerName) {this.customerName = customerName;}public OrderApi cloneOrder() {//创建一个新的订单,然后把本实例的数据复制过去PersonalOrder order = new PersonalOrder();order.setCustomerName(this.customerName);  order.setOrderProductNum(this.orderProductNum);return order;}public class OrderBusiness { public void saveOrder(OrderApi order){  while(order.getOrderProductNum() > 1000){ OrderApi newOrder = order.cloneOrder(); newOrder.setOrderProductNum(1000); order.setOrderProductNum(order.getOrderProductNum()-1000); System.out.println("拆分生成订单=="+newOrder);}

4. 总结

原型模式的本质:克隆生成对象.
原型模式的功能:

  1. 一个是通过克隆来创建新的对象实例
  2. 另一个是为克隆出来的新的对象实例复制原型实例属性的值

深拷贝:除了浅拷贝要克隆的值外,还负责克隆引用类型的数据
浅拷贝:只负责克隆按值传递的数据(比如基本数据类型,String类型)

原型管理器:
如果一个系统中原型的数目不固定,比如系统中的原型可以被动态地创建和销毁,那么就需要在系统中维护一个当前可用的原型的注册表,这个注册表被称为原型管理器。

《研磨设计模式》chap9 原型模式Prototype相关推荐

  1. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...

  2. 设计模式之原型模式(Prototype)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  3. 设计模式之原型模式prototype

    1.原型模式的使用和本质.以及优势: a.通过 new 产生一个对象需要非常繁琐的数据准备或者访问权限,则可以使用原型模式. b.原型模式的使用就是 java 中的克隆技术,以某个对象为原型,复制出新 ...

  4. 【设计模式】—— 原型模式Prototype

    前言:[模式总览]----------by xingoo 模式意图 由于有些时候,需要在运行时指定对象时哪个类的实例,此时用工厂模式就有些力不从心了.通过原型模式就可以通过拷贝函数clone一个原有的 ...

  5. java prototype是什么,java设计模式-原型模式(Prototype)

    定义 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.这就是原型模式的用意 原型模式的结构 原型模式要求对象实现同一个可 ...

  6. 温故而知新:设计模式之原型模式(Prototype)

    原型模式个人以为最适合的场景:参照现有的某一个对象实例,快速得到多个完整的实例副本.(通常是深拷贝的副本) 深拷贝在c#中实现的最简单方式莫过于通过反序列化得到一个全新的对象实例.(当然如果浅拷贝的话 ...

  7. 设计模式五: 原型模式(Prototype)

    简介 原型模式是属于创建型模式的一种,是通过拷贝原型对象来创建新的对象. 万能的Java超类Object提供了clone()方法来实现对象的拷贝. 可以在以下场景中使用原型模式: 构造函数创建对象成本 ...

  8. C++设计模式——原型模式(Prototype Pattern)

    C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...

  9. 设计模式(23):创建型-原型模式(Prototype)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

最新文章

  1. Codeforces 1198 1199
  2. 50个直击灵魂的问题_直击保险人灵魂的五个问题,你怎么回答?
  3. react 数组新增_React 新特性 Hooks 讲解及实例(二)
  4. 【POJ - 3352】Road Construction(Tarjan,边双连通分量)
  5. win10文件同步到服务器失败,win10系统同步时间同步失败的解决方法
  6. sql组合索引和独立索引_SQL索引概述和策略
  7. 韦根协议c语言,韦根协议(26位)及其读取算法
  8. 程序 卡塔_卡塔斯码
  9. 基于 HTML5 + WebGL 的太阳系 3D 可视化系统
  10. 虚幻官方文档使用UMG(虚幻运动图像)的用户界面笔记[VS2019]
  11. hadoopsnappy解压_Hadoop安装配置snappy压缩
  12. FINN(二)CNN,BNN及其硬件实现的背景知识
  13. conda与Anaconda
  14. linux忘记密码修改密码_如何更改我的Linux密码
  15. 脑电EEG概念解释及深度学习结合
  16. 最新互联网地图资质办理-2021测绘资质新规
  17. python爬虫:批量抓取代理ip,进行验证,抓取豆瓣网站影视信息
  18. 总结 — 键盘输入特殊字符
  19. CC2430/CC2431/CC2520/CC2530
  20. 职场生来不公平 透视四大潜规则

热门文章

  1. Android --- Glide加载图片时候调用asBitmap()方法的时候总是报错,点不出来?
  2. 供配电负荷计算方法详解
  3. 2019年备受关注的5个IT系统灾难恢复技术趋势
  4. 为什么不同新旧UPS电池不能混用?浮充电压是什么?
  5. dvwa安装教程linux,Kali 2020.3安装docker和vulhub
  6. python如何在循环中保存文件_python-如何在for循环中更改为另一行文件
  7. windows10安装python环境_在windows10下安装python(配置环境变量),Windows10
  8. Python语言学习之字母R开头函数使用集锦:random/range/replace/reshape用法之详细攻略
  9. 成功解决coordinate_descent.py:491: ConvergenceWarning: Objective did not converge. You might want to inc
  10. 成功解决AttributeError: type object ‘h5py.h5r.Reference‘ has no attribute ‘__reduce_cython__‘