什么时原型模式   或   原型模式的定义:

用原型实例来指定创建对象的种类,并通过拷贝这些原型创建新的对象。

原型模式的特点:

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)的更多相关文章

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

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

  2. 二十四种设计模式:原型模式(Prototype Pattern)

    原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...

  3. [设计模式] 4 原型模式 prototype

    设计模式:可复用面向对象软件的基础>(DP)本文介绍原型模式和模板方法模式的实现.首先介绍原型模式,然后引出模板方法模式. DP书上的定义为:用原型实例指定创建对象的种类,并且通过拷贝这些原型创 ...

  4. 设计模式 笔记 原型模式 prototype

    //---------------------------15/04/07---------------------------- //prototype 原型模式--对象创建型模式 /* 1:意图: ...

  5. python 设计模式之原型模式 Prototype Pattern

    #引入 例子1: 孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递下面是一个邮寄快递的场景:“给我寄个快递.”顾客说.“寄往什么地方?寄给……?”你问.“和上次差不多一样,只是邮 ...

  6. 【UE4 设计模式】原型模式 Prototype Pattern

    概述 描述 使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.如孙悟空猴毛分身.鸣人影之分身.剑光分化.无限剑制 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象, ...

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

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

  8. 创建型设计模式之原型模式(Prototype)

    结构   意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 适用性 当要实例化的类是在运行时刻指定时,例如,通过动态装载:或者 为了避免创建一个与产品类层次平行的工厂类层次时:或 ...

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

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

  10. 设计模式之原型模式(prototype)

    原理:拷贝自身对象实际上就是调用的拷贝构造函数,注意事项是这里的拷贝是深拷贝,即需要拷贝指针所指的内容 #include <stdio.h> #include <memory> ...

随机推荐

  1. SQL记录

    create table test( 教师号 integer , 星期一 integer null, 星期二 integer null, 星期三 integer null); insert into ...

  2. 三种执行SQL语句的的JAVA代码

    问题描述: 连接数据库,执行SQL语句是必不可少的,下面给出了三种执行不通SQL语句的方法. 1.简单的Statement执行SQL语句.有SQL注入,一般不使用. public static voi ...

  3. 个人对RCU的理解

    本文对于RCU的概念不进行解释. 考虑一种比较让人困惑的情形,就是在grace period期间,有新的读者进入,那么这个读者拿到的是新数据还是旧数据,查阅了很多资料都没找到答案,当然对于链表的情况这 ...

  4. 04 MapReduce原理介绍

    大数据实战(上) # MapReduce原理介绍 大纲: * Mapreduce介绍 * MapReduce2运行原理 * shuffle及排序    定义 * Mapreduce 最早是由googl ...

  5. 在Node.js使用mysql模块时遇到的坑

    之前写了个小程序Node News,用到了MySQL数据库,在本地测试均没神马问题.放上服务器运行一段时间后,偶然发现打开页面的时候页面一直处于等待状态,直到Nginx返回超时错误.于是上服务器检查了 ...

  6. angularJS实践过程中出现的问题总结

    同名服务 在一次项目里,之前是同事写的.我有一次在异步获取服务器上的数据时,习惯把api地址写在一个服务Store里,但是程序总是返回Store.api.get()里的get is undefined ...

  7. Ruby中实现module继承

    module FooModule  def self.included base    base.extend ClassMethods  end module ClassMethods    def ...

  8. php的memcache安装,在window10下面

    1.memcached-win对应得安装包 2.解压,可以放到任意目录,以管理员身份打开cmd 3.在安装的目录下面,执行如下命令 memcached.exe -d install 安装 Memcac ...

  9. 解决NetBeans运行web项目时出现的“未能正确设置java DB”问题

    1.在NetBeans导航器中,点击"服务"选项卡: 2.展开"数据库"菜单: 3.在"Java DB"上右键 –> 选择" ...

  10. 如何写 JS 的链式调用 ---》JS 设计模式《----方法的链式调用

    1.以$ 函数为例.通常返回一个HTML元素或一个元素集合. 代码如下: function $(){ var elements = []; ;i<arguments.length;i++){ v ...