原型模式(prototye mode)
//20210117
写在前面:刚期末考试完,考了面向对象,里边儿有23个设计模式,我寻思着考完挨个儿实现一下,本文实现原型模式
原型模式
- 
核心思想:将原有对象完整拷贝出来,然后放进另一个新创的对象里,以达到复制的目的(因为java中如果直接赋值,只是引用,内存中数据改变之后引用的所有对象都会改变,而拷贝不存在这个问题)
 - 
浅拷贝和深拷贝:浅拷贝就是说,将原有对象中的东西复制一份到新对象中,但是有一个问题,如果拷贝的内容中有表层只是引用的对象元素,则浅拷贝拷贝过来之后,旧对象和新对象指向的是相同的对象,只是改变了饮用,所以就产生了深拷贝的概念,其思想就是:将原有对象中所有的元素都完完整整的拿过去,有上述情况的对象,也将其深拷贝到新的对象,这样拷贝结果就和源对象没有任何关系了,仅仅是内容一致(说的有些散乱看不懂请看如下图示)
 - 
浅拷贝
![]()
 - 
深拷贝
![]()
 - 
模式实现源代码:
 
//实体类——内包含浅克隆深克隆方法
import java.util.ArrayList;
import java.util.List;
/**
 * 此处直接使用java内部接口cloneable实现
 */
public class Person implements Cloneable{
    private String name;//姓名
    private int age;//年龄
    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 List<String> getFriends() {
        return friends;
    }
    public void setFriends(List<String> friends) {
        this.friends = friends;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", friends=" + friends +
                '}';
    }
    //浅层克隆
    public Person shallowClone(){
        try{
            return (Person)super.clone();
        }catch (CloneNotSupportedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
    //深藏克隆
    public Person deepClone(){
        try{
            Person person = (Person)super.clone();
            List<String> newFriends = new ArrayList<String>();
            for (String friend : this.getFriends()){
                newFriends.add(friend);
            }
            person.setFriends(newFriends);
            return person;
        }catch(CloneNotSupportedException e){
            e.printStackTrace();
        }
        return null;
    }
}
//测试主方法
import java.util.ArrayList;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        Person person1 = new Person();
        person1.setName("张三");
        person1.setAge(20);
        List<String> friends = new ArrayList<String>();
        friends.add("李四");
        friends.add("王五");
        person1.setFriends(friends);
        System.out.println("原型:"+person1);
        //person2是浅层克隆
        Person person2 = person1.shallowClone();
        //person3是深层克隆
        Person person3 = person1.deepClone();
        //获取浅层克隆的friends的list对象
        List<String> person2_friends = person2.getFriends();
        //向引用对象中添加值
        person2_friends.add("shallow");
        person2.setFriends(person2_friends);
        //获取深层克隆的friends的list对象
        List<String> person3_friends = person3.getFriends();
        //向引用对象中添加值
        person3_friends.add("deep");
        person3.setFriends(person3_friends);
        System.out.println("浅层克隆:"+person2);
        System.out.println("原型:(check prototye 是否因为浅层克隆的元素变更而发生改变)"+person1);
        System.out.println("深层克隆:"+person3);
        System.out.println("原型:(check prototye 是否因为深层克隆的元素变更而发生改变)"+person1);
    }
}
- 输出如下:
![]()
 
以上
希望对大家有所帮助
                    
                


                
            
        
浙公网安备 33010602011771号