设计模式 之 原型模式(ProtoType)
什么时原型模式 或 原型模式的定义:
用原型实例来指定创建对象的种类,并通过拷贝这些原型创建新的对象。
原型模式的特点:
1),它是面向接口编程,
2),原型模式的新对象是对原型实例的一个克隆,但对克隆的程度(浅度克隆,深度克隆)并没作要求。
原型模式实例:
需求:该公司专门生产一种服装产品,它的订单系统需求,其中客户分为个人客户和企业客户,每个订单的产品数超过100就需要进行拆分,直到最终的每个订单的订产品的数量低于100件。
//首先,为客户定义一个公共接口:
public interface Customer {
public customer cloneCustomer();
}
// 实现个人客户订单类
public class PersonalCustomer implements Customer{
private String name ;
private String produceId;
private int produceNum;
public Customer cloneCustomer(){
PersonalCustomer pc= new PersonalCustomer();
pc.setName(this.getName( ) ) ;
pc.setProduceId( this.getProduceId( ) ) ;
pc.setProduceNum( this.getProduceNum( ) ) ;
// 完成克隆,并将该对象返回;
return pc;
}
// 属性的getXXX / setXXXX方法一律省略。
}
// 定义企业客户订单类
public class CompanyCustomer implements Customer {
private String companyName;
private String produceId;
private int produceNum;
public Customer cloneCumster(){
CompanyCustomer cc=new CompanyCustomer();
cc.setCompanyName( this.getCompanyCustomer( ) );
cc.setProduceId( this.getProduceId( ) );
cc.setProduceNum( this.getProduceNum( ) );
// 完成克隆,并返回该新对象;
return cc ;
}
// 属性的 getXXX / setXXX方法一律省略。
}// 订单业务类
public class client {
public static void main( String arg[] ){
CompanyCustomer c =new CompanyCustomer();
c.setCompanyName(" 淘宝 " ) ;
c.setProduceId(" 12sadf45as6df ");
c.setProduceNum( 550 );
List<Customer> orders_01= Client.orderForm( c );
PersonalCustomer p =new PersonalCustomer();
p.setName(" 马某");
p.setProduceId("asdfasdf1245sdf");
p.setProduceNum("660 ");
List<Customer> orders_02 = Client.orderForm( p );
// 输出的代码省略;
}
// 业务方法,下订单;
public static List<Customer> orderForm( Customer cus ){
List<Customer> orders = new ArrayList<Customer> () ;
if (cus.getProduceNum ( ) > 100){
do{
orders.add( cus.cloneCustomer( ).setProduceNum( 100 ) );
cus.setProduceNum( cus.getProduceNum( ) - 100 ) ;
}while( cus.getProduceNum > 100 ) ;
}
if ( cus.getProduceNum( ) > 0 ){
orders.add( cus );
}
return orders ;
}
}
注:
浅度克隆:只负责克隆按值传递的数据(比如基本类型,string类型)。
深度克隆:除了浅度克隆所需要的克隆的值外,还负责克隆应用类型的数据,基本上就是被克隆实例的所有属性数据都会被克隆出来。
其中,深度克隆还有一个特点,就是深度克隆实例的引用类型的属性都必须实现克隆,否则就会出现克隆失败。
关于克隆:
java中的克隆接口:Cloneable
eg:
Import java.lang.Cloneable;
public class personalorder implements Cloneable
{
public Object clone(){
Object obj=null;
try{
obj= super.clone();
}catch( CloneNotSupportedException e ){
e.printStackTrace();
}
//其它业务省略;
}
}
设计模式 之 原型模式(ProtoType)的更多相关文章
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...
- 二十四种设计模式:原型模式(Prototype Pattern)
原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...
- [设计模式] 4 原型模式 prototype
设计模式:可复用面向对象软件的基础>(DP)本文介绍原型模式和模板方法模式的实现.首先介绍原型模式,然后引出模板方法模式. DP书上的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创 ...
- 设计模式 笔记 原型模式 prototype
//---------------------------15/04/07---------------------------- //prototype 原型模式--对象创建型模式 /* 1:意图: ...
- python 设计模式之原型模式 Prototype Pattern
#引入 例子1: 孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递下面是一个邮寄快递的场景:“给我寄个快递.”顾客说.“寄往什么地方?寄给……?”你问.“和上次差不多一样,只是邮 ...
- 【UE4 设计模式】原型模式 Prototype Pattern
概述 描述 使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.如孙悟空猴毛分身.鸣人影之分身.剑光分化.无限剑制 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象, ...
- 【设计模式】—— 原型模式Prototype
前言:[模式总览]——————————by xingoo 模式意图 由于有些时候,需要在运行时指定对象时哪个类的实例,此时用工厂模式就有些力不从心了.通过原型模式就可以通过拷贝函数clone一个原有的 ...
- 创建型设计模式之原型模式(Prototype)
结构 意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性 当要实例化的类是在运行时刻指定时,例如,通过动态装载:或者 为了避免创建一个与产品类层次平行的工厂类层次时:或 ...
- 设计模式五: 原型模式(Prototype)
简介 原型模式是属于创建型模式的一种,是通过拷贝原型对象来创建新的对象. 万能的Java超类Object提供了clone()方法来实现对象的拷贝. 可以在以下场景中使用原型模式: 构造函数创建对象成本 ...
- 设计模式之原型模式(prototype)
原理:拷贝自身对象实际上就是调用的拷贝构造函数,注意事项是这里的拷贝是深拷贝,即需要拷贝指针所指的内容 #include <stdio.h> #include <memory> ...
随机推荐
- 共有31款PHP 图形/图像处理开源软件(转)
详情点击:http://www.oschina.net/project/lang/22/php?tag=141&os=0&sort=view PHP 图像处理库 Grafika Gra ...
- SpringMVC学习记录5
Springmvc流程中的扩展点有很多,可以在很多地方插入自己的代码逻辑达到控制流程的目的. 如果要对Controller的handler方法做统一的处理.我想应该会有很多选择,比如:@ModelAt ...
- Could not find or load main class org.gradle.wrapper.GradleWrapperMain解决办法
解决办法: gradlew is the gradle wrapper executable - batch script on windows and shell script elsewhere. ...
- ruby 基础知识(二)
ruby 中的动态方法 http://singleant.iteye.com/blog/1680382 Rails 大量使用了符号(symbol).符号看上去很像变量名,不过以冒号作为前缀.符号的例 ...
- Django 1.7 Tutorial 学习笔记
官方教程在这里 : Here 写在前面的废话:)) 以前学习新东西,第一想到的是找本入门教程,按照书上做一遍.现在看了各种网上的入门教程后,我觉得还是看官方Tutorial靠谱.书的弊端一说一大推 本 ...
- 高可用mysql之MHA源码剖析
* MHA的整个故障(离线)切换过程 - 检测主库的状态,确认是否崩溃. - 确认服务崩溃,保存binlog,推送到主控机,并可以强制关闭主库避免脑裂. - 找出数据最新的从库(也就是read_mas ...
- 【About Queue】(待改)
队列 队列满足FIFO规则,先进先出. C语言代码:(Segmentation fault你大爷(メ ゚皿゚)メ) #include<stdio.h> #include<stdlib ...
- tips~function pointer
An simple example: #include<stdio.h> int plus(int a,int b) { return a+b; } int main() { int (* ...
- rails数据库查询 N + 1 查询的解决办法
schema.rb ActiveRecord::Schema.define(version: 20150203032005) do create_table "addresses" ...
- Redis 3.0 与 3.2 配置文件变化
一.Redis3.0 与 3.2 配置文件对比 1. clone redis git clone https://github.com/antirez/redis.git 2. checkout分支 ...