博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式 之 原型模式(ProtoType)
阅读量:5102 次
发布时间:2019-06-13

本文共 2377 字,大约阅读时间需要 7 分钟。

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

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

 原型模式的特点:

 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();

            }

         //其它业务省略;

   }

 

}

 

转载于:https://www.cnblogs.com/outpointexception/p/4427450.html

你可能感兴趣的文章
程序员的数学
查看>>
聚合与组合
查看>>
洛谷 P2089 烤鸡【DFS递归/10重枚举】
查看>>
我眼中的技术地图
查看>>
lc 145. Binary Tree Postorder Traversal
查看>>
android dialog使用自定义布局 设置窗体大小位置
查看>>
ionic2+ 基础
查看>>
[leetcode]Minimum Path Sum
查看>>
Aizu - 1378 Secret of Chocolate Poles (DP)
查看>>
IO流写出到本地 D盘demoIO.txt 文本中
查看>>
Screening technology proved cost effective deal
查看>>
mysql8.0.13下载与安装图文教程
查看>>
Thrift Expected protocol id ffffff82 but got 0
查看>>
【2.2】创建博客文章模型
查看>>
Kotlin动态图
查看>>
从零开始系列之vue全家桶(1)安装前期准备nodejs+cnpm+webpack+vue-cli+vue-router
查看>>
Jsp抓取页面内容
查看>>
大三上学期软件工程作业之点餐系统(网页版)的一些心得
查看>>
可选参数的函数还可以这样设计!
查看>>
[你必须知道的.NET]第二十一回:认识全面的null
查看>>