原型模式

    xiaoxiao2021-03-25  104

    原型模式 故名思议是依赖于原型,创建一个和原来一模一样的新对象。 原型模式的使用:如印刷厂钞票的复印,钞票的复印只需要一个钞票的原型,根据这个原型可以复印出很多一样的钞票。在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(); }

    运行结果和上面一样

    转载请注明原文地址: https://ju.6miu.com/read-16936.html

    最新回复(0)