(4)设计模式之原型模式(创建型模式)

声明:以下都是博主浅薄的经验之谈,欢迎大家学习交流

  • 原型模式分为两种
    浅度克隆
    深度克隆

引入克隆模式的介绍

public class MainClass {
    public static void main(String[] args) {
    /***引入克隆模式的介绍****/
    /**当创建两个类似person对象的时候,属性中只有名字发生了改变其他的属性没有改变的情况下,以下代码就可以进行优化**/
        Person p1 = new Person();
        p1.setAge(12);
        p1.setName("张某将");
        p1.setSex("男");
        Person p2 = new Person();
        p2.setAge(12);
        p2.setName("张金福");
        p2.setSex("男");
        }
}

浅度克隆

  • Person.java
public class Person implements Cloneable {
    private String name;
    private int age;
    private String sex;
    private List<String> friends;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public List<String> getFriends() {
        return friends;
    }

    public void setFriends(List<String> friends) {
        this.friends = friends;
    }
    public Person clone() {
        try {
            return (Person)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", sex=" + sex + ", friends=" + friends + "]";
    }
  • MainClass.java
public class MainClass {
    public static void main(String[] args) {
        /**1.克隆模式(浅度克隆)***/
        /**如果对象的属性属于引用变量类型,那么只进行地址的克隆(除去String类型) **/
        /**也就是说对p4 的List<String> friends;的变量值进行改变,那么 p3的List<String> friends 也会改变**/
        List<String> friends = new ArrayList<>();
        friends.add("八戒程序猿");
        friends.add("Kobe");
        Person p3 = new Person();
        p3.setAge(12);
        p3.setName("张xx");
        p3.setSex("男");
        p3.setFriends(friends);
        Person p4 = p3.clone();
        p3.setAge(14);//修改p3年龄
        p3.getFriends().add("Jmes");
        p4.setName("张金福");

    }

深度克隆

public class Person implements Cloneable {
    private String name;
    private int age;
    private String sex;
    private List<String> friends;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public List<String> getFriends() {
        return friends;
    }

    public void setFriends(List<String> friends) {
        this.friends = friends;
    }

    public Person clone() {
        try {
            Person clone = (Person) super.clone();
            List<String> newFriends = new ArrayList<>();
            for (String friend : this.friends) {
                newFriends.add(friend);
            }
            clone.setFriends(newFriends);
            return clone;
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", sex=" + sex + ", friends=" + friends + "]";
    }
  • MainClass.java
public class MainClass {
    public static void main(String[] args) {
        /**深度度克隆)***/
        /**此方式属于深度的克隆,对于该对象类变量属于引用变量类型的也进行复制(也就是说重新开辟一块内存堆)**/
        List<String> friends = new ArrayList<>();
        friends.add("八戒程序猿");
        friends.add("Kobe");
        Person p3 = new Person();
        p3.setAge(12);
        p3.setName("张xx");
        p3.setSex("男");
        p3.setFriends(friends);

        Person p4 = p3.clone();
        p3.setAge(14);//修改p3年龄
        p3.getFriends().add("Jmes");
        p4.setName("张金福");
        System.out.println("p3 对象" + p3);
        System.out.println("p4 对象" + p4);
    }
}

猜你喜欢

转载自blog.csdn.net/JavaMrZhang/article/details/71194977