六、原型模式

    xiaoxiao2022-07-15  152

    原型模式

    1、什么是原型模式2、原型模式的特点3、原型模式应用场景4、代码实现浅度克隆深度克隆

    1、什么是原型模式

    Prototype模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例。使用Prototype模式创建的实例,具有与原型一样的数据。

    2、原型模式的特点

    1.由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。2.目标对象是原型对象的一个克隆。也就是说,通过Prototype模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值。3.根据对象克隆深度层次的不同,有浅度克隆与深度克隆。

    3、原型模式应用场景

    在创建对象的时候,我们不只是希望被创建的对象继承其基类的基本结构,还希望继承原型对象的数据。希望对目标对象的修改不影响既有的原型对象(深度克隆的时候可以完全互不影响)。隐藏克隆操作的细节。很多时候,对对象本身的克隆需要涉及到类本身的数据细节。

    4、代码实现

    浅度克隆

    package com.example.demo01; import java.util.List; /** * 浅度克隆 * @author Guardian * */ public class Person implements Cloneable{ private String sex; private String name; private int age; private List<String> friend; public List<String> getFriend() { return friend; } public void setFriend(List<String> friend) { this.friend = friend; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person clone(){ try { return (Person)super.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } } package com.example.demo01; import java.util.ArrayList; import java.util.List; import org.junit.Test; import com.example.demo01.Person; public class MainClass { @Test public void test01(){ Person p1 = new Person(); p1.setName("张三"); p1.setSex("男"); p1.setAge(12); Person p2 = new Person(); p2.setName("里斯"); p2.setSex("女"); p2.setAge(12); } @Test public void test02(){ Person p1 = new Person(); p1.setName("张三"); p1.setSex("男"); p1.setAge(12); // Person p2 = p1;两个完全不同,这个引用堆相同;下边的完全复制一个新的堆 Person p2 = p1.clone(); p1.setName("zhangsan"); System.out.println(p2.getName()); } @Test public void test03(){ Person p1 = new Person(); List<String> friends = new ArrayList<>(); friends.add("zhangsan"); friends.add("lisi"); friends.add("wangwu"); p1.setFriend(friends); Person p2 = p1.clone(); System.out.println(p1.getFriend()); System.out.println(p2.getFriend()); friends.add("Mike"); System.out.println(p1.getFriend()); System.out.println(p2.getFriend()); } }

    深度克隆

    package com.example.demo02; import java.util.ArrayList; import java.util.List; /** * 深度克隆 * @author Guardian * */ public class Person implements Cloneable{ private String sex; private String name; private int age; private List<String> friends; public List<String> getFriends() { return friends; } public void setFriends(List<String> friends) { this.friends = friends; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person clone(){ try { Person person = (Person) super.clone(); List<String> friends = new ArrayList<String>(); for (String friend : this.getFriends()) { friends.add(friend); } person.setFriends(friends); return person; } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } } package com.example.demo02; import java.util.ArrayList; import java.util.List; import org.junit.Test; import com.example.demo02.Person; public class MainClass { @Test public void test01(){ Person p1 = new Person(); List<String> friends = new ArrayList<>(); friends.add("zhangsan"); friends.add("lisi"); friends.add("wangwu"); p1.setFriends(friends); Person p2 = p1.clone(); System.out.println(p1.getFriends()); System.out.println(p2.getFriends()); friends.add("Mike"); p1.setFriends(friends); System.out.println(p1.getFriends()); System.out.println(p2.getFriends()); } }
    最新回复(0)