设计模式 之 原型模式(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();

            }

         //其它业务省略;

   }

 

}

 

posted @ 2015-04-15 03:01  OutPointException  阅读(208)  评论(0编辑  收藏  举报