原型模式(Prototype):故名思议是依赖于原型,创建一个和原来一模一样的新对象。
原型模式的使用:如印刷厂钞票的复印,钞票的复印只需要一个钞票的原型,根据这个原型可以复印出很多一样的钞票。在Java中,由于Java是地址传递的,所以可以直接将对象赋给新的对象,如果修改新的对象时,原有的对象值也被修改。如果不希望影响原来的值,则就不能采用直接赋值的方式,可以采用原型模式。生成两个独立的且相同的对象。
直接赋值对象的方式,导致原来对象和新对象数据同时改变示例:
Product.java
public class Product {
private double num;
private double price;
private double rebate;
public double getNum() {
return num;
}
public void setNum(double num) {
this.num = num;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public double getRebate() {
return rebate;
}
public void setRebate(double rebate) {
this.rebate = rebate;
}
}
Client.java
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
Product product =new Product();
product.setNum(10);
product.setPrice(15);
product.setRebate(20);
System.out.println("原来的对象:num="+product.getNum()+"price="+product.getPrice()+"rebate="+product.getRebate());
Product product1=product;
System.out.println("新的对象:num="+product1.getNum()+"price="+product1.getPrice()+"rebate="+product1.getRebate());
product1.setNum(20);
product1.setPrice(30);
product1.setRebate(40);
System.out.println("修改后原来的对象:num="+product.getNum()+"price="+product.getPrice()+"rebate="+product.getRebate());
System.out.println("修改后新的对象:num="+product1.getNum()+"price="+product1.getPrice()+"rebate="+product1.getRebate());
}
}
运行结果:
原来的对象:num=10.0price=15.0rebate=20.0
新的对象:num=10.0price=15.0rebate=20.0
修改后原来的对象:num=20.0price=30.0rebate=40.0
修改后新的对象:num=20.0price=30.0rebate=40.0
使用Java克隆接口来进行实现原型模式
ProductClone.java
public class ProductClone implements Cloneable {
private double num;
private double price;
private double rebate;
public double getNum() {
return num;
}
public void setNum(double num) {
this.num = num;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public double getRebate() {
return rebate;
}
public void setRebate(double rebate) {
this.rebate = rebate;
}
//复制对象
public Object clone(){
Object obj=null;
try{
obj=super.clone();
}catch(CloneNotSupportedException ex){
System.out.println(ex);
}
return obj;
}
}
Clinet.java
public class Client1 {
/**
* @param args
*/
public static void main(String[] args) {
ProductClone productClone =new ProductClone();
productClone.setNum(10);
productClone.setPrice(15);
productClone.setRebate(20);
System.out.println("原来的对象:num="+productClone.getNum()+"price="+productClone.getPrice()+"rebate="+productClone.getRebate());
ProductClone productClone1=(ProductClone)productClone.clone();
System.out.println("新的对象:num="+productClone1.getNum()+"price="+productClone1.getPrice()+"rebate="+productClone1.getRebate());
productClone1.setNum(20);
productClone1.setPrice(30);
productClone1.setRebate(40);
System.out.println("修改后原来的对象:num="+productClone.getNum()+"price="+productClone.getPrice()+"rebate="+productClone.getRebate());
System.out.println("修改后新的对象:num="+productClone1.getNum()+"price="+productClone1.getPrice()+"rebate="+productClone1.getRebate());
}
}
运行结果:
原来的对象:num=10.0price=15.0rebate=20.0
新的对象:num=10.0price=15.0rebate=20.0
修改后原来的对象:num=10.0price=15.0rebate=20.0
修改后新的对象:num=20.0price=30.0rebate=40.0
不使用Java提供的克隆方法来进行实现原型模式
Clone.java
public abstract class Clone {
private double num;
private double price;
private double rebate;
public double getNum() {
return num;
}
public void setNum(double num) {
this.num = num;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public double getRebate() {
return rebate;
}
public void setRebate(double rebate) {
this.rebate = rebate;
}
//复制对象
public abstract Object clone();
}
ProductClone.java
public class ProductClone extends Clone {
@Override
public Clone clone() {
// TODO Auto-generated method stub
Clone obj=new ProductClone();
try{
obj.setNum(super.getNum());
obj.setPrice(super.getPrice());
obj.setRebate(super.getRebate());
}catch(Exception ex){
System.out.println(ex);
}
return obj;
}
}
Client.java
public class Client {
public static void main(String[] args) {
Clone product=new ProductClone();
product.setNum(10);
product.setPrice(15);
product.setRebate(15);
System.out.println("原来的对象:num="+product.getNum()+"price="+product.getPrice()+"rebate="+product.getRebate());
Clone product1=(Clone)product.clone();
System.out.println("新的对象:num="+product1.getNum()+"price="+product1.getPrice()+"rebate="+product1.getRebate());
product1.setNum(20);
product1.setPrice(30);
product1.setRebate(40);
System.out.println("修改后原来的对象:num="+product.getNum()+"price="+product.getPrice()+"rebate="+product.getRebate());
System.out.println("修改后新的对象:num="+product1.getNum()+"price="+product1.getPrice()+"rebate="+product1.getRebate());
}
/// System.out.println();
}
运行结果跟上面一样。