原型模式

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

运行结果和上面一样

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值