//原型模式:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象
//简单来说,当进行面向接口编程时,假设须要复制这一接口对象时。因为不知道他的详细类型并且不能实例化一个接口
//这时就须要用到原型模式,让你在不知道对象详细类型的情况下进行对象的复制
//原型模式功能:1.通过克隆来创建新的对象实例;2.为克隆出来的对象实例复制原型实例属性的值
//实比例如以下:(未使用Object的clone方法)用来对产品数量超过1000的订单进行分隔。分隔为容量<=1000的N个订单
public interface OrderApi {
public int getOrderProductNum();
public void setOrderProductNum(int num);
public OrderApi cloneOrder();
}
public class PersonalOrder implements OrderApi {
private String customerName;
private String productId;
private int orderProductNum = 0; //各种get,set方法,此处略去N多字
public OrderApi cloneOrder() {
PersonalOrder order = new PersonalOrder();
order.setCustomerName(this.customerName);
order.setProductId(this.productId);
order.setOrderProductNum(this.orderProductNum);
return order;
}
}
public class OrderBusiness {//相当于Client
public void saveOrder(OrderApi order) {
//当使用Object的clone方法时。这样PersonalOrder oa1 = new PersonalOrder();
while(order.getOrderProductNum() > 1000) {
OrderApi newOrder = order.cloneOrder();
newOrder.setOrderProductNum(1000);
order.setOrderProductNum(order.getOrderProductNum(()-1000);
System.out.println("拆分订单="+newOrder);
}
System.out.println("订单="+order);//最后剩下不足1000的订单
}
}
//=============================================================================
//使用Object的clone方法的实现不再写了,主要差别就是:接口是没有clone方法的
//所以在实例化对象时就不能用原来的面向接口了 //原型模式中另一个问题。即:浅度克隆和深度克隆
//浅度克隆:能够理解为仅仅须要对原对象中的值进行克隆,假设有引用类型(对象)。则新对象中的变量是指向原对象的
//深度克隆:不光进行浅度克隆,还要对该对象中所包括的全部引用类型(对象)进行递归克隆
//假设要使用深度克隆,那么该对象中全部的对象都要有clone方法
//并且假设该对象所处的层级较高,即当中包括有多种对象,对象中又包括对象,递归克隆起来可能会很麻烦

设计模式入门之原型模式Prototype的更多相关文章

  1. Net设计模式实例之原型模式( Prototype Pattern)

    一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...

  2. 设计模式系列之原型模式(Prototype Pattern)——对象的克隆

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  3. 设计模式学习心得<原型模式 Prototype >

    原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式是实现了一个原型接口,该接口用于创建当 ...

  4. IOS设计模式浅析之原型模式(Prototype)

    原型模式的定义 “使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象”.最初的定义出现于<设计模式>(Addison-Wesley,1994). 简单来理解就是根据这个原型创建 ...

  5. 《JAVA设计模式》之原型模式(Prototype)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述原型(Prototype)模式的: 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办 ...

  6. [工作中的设计模式]原型模式prototype

    一.模式解析 提起prototype,最近看多了js相关的内容,第一印象首先是js的原型 var Person=function(name){ this.name=name; } Person.pro ...

  7. 设计模式(四)原型模式Prototype(创建型)

      设计模式(四)原型模式Prototype(创建型) 1.   概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象 ...

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

    原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...

  9. PHP设计模式 原型模式(Prototype)

    定义 和工厂模式类似,用来创建对象.但实现机制不同,原型模式是先创建一个对象,采用clone的方式进行新对象的创建. 场景 大对象的创建. 优点 1.可以在运行时刻增加和删除产品 2.可以改变值或结构 ...

随机推荐

  1. Lex与Yacc学习(四)之Lex规范

    Lex规范的结构 lex程序由三部分组成:定义段.规则段和用户子例程序段 ...定义段... %% ...规则段... %% ...用户子例程序段... 这些部分由以两个百分号组成的行分隔开.尽管某一 ...

  2. LeetCode 673. Number of Longest Increasing Subsequence

    Given an unsorted array of integers, find the number of longest increasing subsequence. Example 1: I ...

  3. Android开发——Android的消息机制详解

    )子线程默认是没有Looper的,Handler创建前,必须手动创建,否则会报错.通过Looper.prepare()即可为当前线程创建一个Looper,并通过Looper.loop()来开启消息循环 ...

  4. unittest跳过测试和预期失败

    在运行测试时,有时需要直接跳过某些测试用例,或者当用例符合某个条件时跳过测试,又或者直接将测试用例设置为失败.unittest提供了这些需求的装饰器. unittest.skip(reason) 无条 ...

  5. 2017 ACM/ICPC Asia Regional Qingdao Online

    Apple Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submi ...

  6. AS创建工程结构

  7. cf287D Shifting

    John Doe has found the beautiful permutation formula. Let's take permutation p = p1, p2, ..., pn. Le ...

  8. poj 1061 青蛙的约会(二元一次不定方程)

      Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要 ...

  9. ElasticSearch聚合入门(续)

    主要理解聚合中的terms. 参考:http://www.cnblogs.com/xing901022/p/4947436.html Terms聚合 记录有多少F,多少M { "size&q ...

  10. App后台运行通知函数

    
[[UIApplicationsharedApplication] beginBackgroundTaskWithExpirationHandler: ^() { //程序在10分钟内未被系统关闭或 ...