zoukankan      html  css  js  c++  java
  • 设计模式 之 原型模式(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();

                }

             //其它业务省略;

       }

     

    }

  • 相关阅读:
    C++常用库
    如何学好VC和MFC(各前辈学*方法及感受整理)(五)
    如何学好VC和MFC(各前辈学习方法及感受整理)(一)
    基于Winsock API的VC网络编程实战
    const int *p和int * const p的区别(常量指针与指向常量的指针) .
    java中的“包”与C#中的“命名空间
    vc加载lib文件的方法
    C|C++中的静态全局变量,静态局部变量,全局变量,局部变量的区别
    如何学好VC和MFC(各前辈学习方法及感受整理)(三)
    如何学好VC和MFC(各前辈学习方法及感受整理)(二)
  • 原文地址:https://www.cnblogs.com/outpointexception/p/4427450.html
Copyright © 2011-2022 走看看