学习笔记(13):第2章 架构师内功心法之设计模式 -分析原型模式浅克隆带来的问题

立即学习:https://edu.csdn.net/course/play/28941/403601?utm_source=blogtoedu

原型模式的通用写法

IProtortype接口

public interface IProtortype <T>{
    T clone();
}

 创建具体需要克隆对象的类ConcretePrototype

public class ConcretePrototype implements IProtortype{

    private int age;
    private String name;

    public int getAge(){
        return age;
    }
    public void setAge(int age){
        this.age = age;
    }
    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }
    @Override
    public ConcretePrototype clone() {
        ConcretePrototype concretePrototype = new ConcretePrototype();
        concretePrototype.setAge(this.age);
        concretePrototype.setName(this.name);
        return concretePrototype;
    }

    public String toString(){
        return "ConcretePrototype{"+
                "age = " + age +
                ", name = " + name +'\''+
                '}';
    }

}

浅克隆

import lombok.Data;

import java.util.List;

@Data
public class ConcretePrototype implements Cloneable {

    private int age;
    private String name;
    private List<String> hobbies;


    @Override
    public ConcretePrototype clone() {
        try {
            //这是浅克隆,对引用类型的属性只能克隆其引用,而不是其值(也就是克隆对象与原型对象的
            // 引用类型的属性指向同一个内存地址)
            return (ConcretePrototype)super.clone();
        }catch (Exception e){
            return null;
        }

    }

    public String toString(){
        return "ConcretePrototype{"+
                "age = " + age +
                ", name = '" + name +'\''+
                ", hobbies = " + hobbies +
                '}';
    }

}

深克隆

//序列化实现深克隆
@Data
public class ConcretePrototype implements Cloneable, Serializable {

    private int age;
    private String name;
    private List<String> hobbies;


    @Override
    public ConcretePrototype clone() {
        try {
            //这是浅克隆,对引用类型的属性只能克隆其引用,而不是其值(也就是克隆对象与原型对象的
            // 引用类型的属性指向同一个内存地址)
            return (ConcretePrototype)super.clone();
        }catch (Exception e){
            return null;
        }

    }
//硬编码实现深克隆  将原型的引用属性进行拷贝或克隆
    public ConcretePrototype deepCloneHobbies() {
        try {
            ConcretePrototype result = (ConcretePrototype) super.clone();
            result.hobbies = (List) ((ArrayList) result.hobbies).clone();
            return result;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    //序列化实现深克隆
    public ConcretePrototype deepClone(){
        try{
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(this);

            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bis);

            return (ConcretePrototype) ois.readObject();

        }catch (Exception e){
            e.printStackTrace();
            return null;
        }

    }

    public String toString(){
        return "ConcretePrototype{"+
                "age = " + age +
                ", name = '" + name +'\''+
                ", hobbies = " + hobbies +
                '}';
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_43222122/article/details/107770223
今日推荐