java设计模式|原型模式

原型模式

package prototype;

public class PrototypeTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        BaseInfo baseInfo = new BaseInfo("xxx");
        Product product = new Product("part1","part2",3,4,baseInfo);
        Product clone= (Product) product.clone();
        System.out.println("original:"+product);
        System.out.println("clone:"+clone);

        product.getBaseInfo().setCompayName("yyy");
        System.out.println("original:"+product);
        System.out.println("clone:"+clone);
    }
}

class BaseInfo implements  Cloneable{
    private String compayName;

    public BaseInfo(String compayName) {
        this.compayName = compayName;
    }

    public String getCompayName() {
        return compayName;
    }

    public void setCompayName(String compayName) {
        this.compayName = compayName;
    }

    @Override
    protected BaseInfo clone() throws CloneNotSupportedException {
        return ((BaseInfo)super.clone());
    }

    @Override
    public String toString() {
        return super.hashCode()+" "+"BaseInfo{" +
                "compayName='" + compayName + '\'' +
                '}';
    }
}

class Product implements Cloneable{
    private String part1;
    private String part2;
    private Integer part3;
    private Integer part4;
    private BaseInfo baseInfo;

    public Product() {
    }

    public Product(String part1, String part2, Integer part3, Integer part4,BaseInfo baseInfo) {
        this.part1 = part1;
        this.part2 = part2;
        this.part3 = part3;
        this.part4 = part4;
        this.baseInfo = baseInfo;
    }

    public String getPart1() {
        return part1;
    }

    public void setPart1(String part1) {
        this.part1 = part1;
    }

    public String getPart2() {
        return part2;
    }

    public void setPart2(String part2) {
        this.part2 = part2;
    }

    public Integer getPart3() {
        return part3;
    }

    public void setPart3(Integer part3) {
        this.part3 = part3;
    }

    public Integer getPart4() {
        return part4;
    }

    public void setPart4(Integer part4) {
        this.part4 = part4;
    }

    public BaseInfo getBaseInfo() {
        return baseInfo;
    }

    public void setBaseInfo(BaseInfo baseInfo) {
        this.baseInfo = baseInfo;
    }

    @Override
    public String toString() {
        return super.hashCode()+" Product{" +
                "part1='" + part1 + '\'' +
                ", part2='" + part2 + '\'' +
                ", part3=" + part3 +
                ", part4=" + part4 +
                ", baseInfo=" + baseInfo +
                '}';
    }

    @Override
    protected Product clone() throws CloneNotSupportedException {

        Product clone = (Product) super.clone();
        BaseInfo baseInfoClone=this.baseInfo.clone();
        clone.setBaseInfo(baseInfoClone);
        return clone;
    }
}

第二种实现方法(不推荐,消耗内存)

package prototype;

import java.io.*;

public class PrototypeTest {
    public static void main(String[] args) throws CloneNotSupportedException {
        BaseInfo baseInfo = new BaseInfo("xxx");
        Product product = new Product("part1","part2",3,4,baseInfo);
        Product clone= (Product) product.clone();
        System.out.println("original:"+product);
        System.out.println("clone:"+clone);

        product.getBaseInfo().setCompayName("yyy");
        System.out.println("original:"+product);
        System.out.println("clone:"+clone);
    }
}

class BaseInfo implements  Cloneable,Serializable{
    private String compayName;

    public BaseInfo(String compayName) {
        this.compayName = compayName;
    }

    public String getCompayName() {
        return compayName;
    }

    public void setCompayName(String compayName) {
        this.compayName = compayName;
    }

    @Override
    protected BaseInfo clone() throws CloneNotSupportedException {
        return ((BaseInfo)super.clone());
    }

    @Override
    public String toString() {
        return super.hashCode()+" "+"BaseInfo{" +
                "compayName='" + compayName + '\'' +
                '}';
    }
}

class Product implements Cloneable ,Serializable{
    private String part1;
    private String part2;
    private Integer part3;
    private Integer part4;
    private BaseInfo baseInfo;

    public Product() {
    }

    public Product(String part1, String part2, Integer part3, Integer part4,BaseInfo baseInfo) {
        this.part1 = part1;
        this.part2 = part2;
        this.part3 = part3;
        this.part4 = part4;
        this.baseInfo = baseInfo;
    }

    public String getPart1() {
        return part1;
    }

    public void setPart1(String part1) {
        this.part1 = part1;
    }

    public String getPart2() {
        return part2;
    }

    public void setPart2(String part2) {
        this.part2 = part2;
    }

    public Integer getPart3() {
        return part3;
    }

    public void setPart3(Integer part3) {
        this.part3 = part3;
    }

    public Integer getPart4() {
        return part4;
    }

    public void setPart4(Integer part4) {
        this.part4 = part4;
    }

    public BaseInfo getBaseInfo() {
        return baseInfo;
    }

    public void setBaseInfo(BaseInfo baseInfo) {
        this.baseInfo = baseInfo;
    }

    @Override
    public String toString() {
        return super.hashCode()+" Product{" +
                "part1='" + part1 + '\'' +
                ", part2='" + part2 + '\'' +
                ", part3=" + part3 +
                ", part4=" + part4 +
                ", baseInfo=" + baseInfo +
                '}';
    }

    @Override
    protected Product clone() throws CloneNotSupportedException {

        //第一个版本
//        Product clone = (Product) super.clone();
//        BaseInfo baseInfoClone=this.baseInfo.clone();
//        clone.setBaseInfo(baseInfoClone);
//        return clone;

        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);
            Object object=ois.readObject();
            return (Product) object;
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return null;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值