JAVA设计模式(系列) 原型模式

浅拷贝/深拷贝
序列化机制实现深拷贝
模式定义:原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的的对象实例;

public class ProtoType {
    public static void main(String[] args) throws CloneNotSupportedException {

        Product product = new Product("name", new String[]{"1", "wq"},new ProductBaseInfo("213"));
        Product clone = product.clone();

        System.out.println(product);
        System.out.println(clone);
        System.out.println(product==clone);

        System.out.println();
        //验证浅拷贝
        //重写 clone方法;使得里面的ProductBaseInfo也拷贝;否则对象引用的还是原来的
        product.getProductBaseInfo().setInfo("789");
        System.out.println(product);
        System.out.println(clone);
    }
}
/**
 * 1:实现 Cloneable接口
 *:2:重写 clone方法
 */
class Product implements  Cloneable, Serializable {
    static final long serialVersionUID = 42L;
    String productName;
    String[] names;
    ProductBaseInfo productBaseInfo;
    @Override
    protected Product clone() throws CloneNotSupportedException {
       //1:重写 clone方法实现:
//        Product product = (Product) super.clone();
//        ProductBaseInfo productBaseInfo = this.productBaseInfo.clone();
//        product.setProductBaseInfo(productBaseInfo);
//        return product;
        //2: 使用流进行拷贝
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        try {
            ObjectOutputStream oos = new ObjectOutputStream(byteArrayOutputStream);
            oos.writeObject(this);
        } catch (IOException e) {
            e.printStackTrace();
        }
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
        try {
            ObjectInputStream ois = new ObjectInputStream(byteArrayInputStream);
            Product product = (Product)ois.readObject();
            return product;
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
    public Product() {
    }
    public Product(String productName, String[] names, ProductBaseInfo productBaseInfo) {
        this.productName = productName;
        this.names = names;
        this.productBaseInfo = productBaseInfo;
    }
    @Override
    public String toString() {
        return "Product{" +
                "productName='" + productName + '\'' +
                ", names=" + Arrays.toString(names) +
                ", productBaseInfo=" + productBaseInfo +
                '}';
    }
    public String getProductName() {
        return productName;
    }
    public void setProductName(String productName) {
        this.productName = productName;
    }
    public String[] getNames() {
        return names;
    }
    public void setNames(String[] names) {
        this.names = names;
    }
    public ProductBaseInfo getProductBaseInfo() {
        return productBaseInfo;
    }
    public void setProductBaseInfo(ProductBaseInfo productBaseInfo) {
        this.productBaseInfo = productBaseInfo;
    }
}
class ProductBaseInfo implements Cloneable, Serializable {
    static final long serialVersionUID = 42L;
    @Override
    protected ProductBaseInfo clone() throws CloneNotSupportedException {
        return (ProductBaseInfo)super.clone();
    }
    String info;

    public String getInfo() {
        return info;
    }
    public void setInfo(String info) {
        this.info = info;
    }
    public ProductBaseInfo() {
    }
    public ProductBaseInfo(String info) {
        this.info = info;
    }
    @Override
    public String toString() {
        return "{" +
                "info='" + info + '\'' +
                '}';
    }
}
发布了55 篇原创文章 · 获赞 3 · 访问量 5221

猜你喜欢

转载自blog.csdn.net/qq_38130094/article/details/104072689
今日推荐