設計模式——原型模式

原型模式(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();
}

運行結果跟上面一樣。

發佈了43 篇原創文章 · 獲贊 6 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章