什么时原型模式 或 原型模式的定义:
用原型实例来指定创建对象的种类,并通过拷贝这些原型创建新的对象。
原型模式的特点:
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();
}
//其它业务省略;
}
}