第八讲、原型模式

1.定义

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

2.原型模式的特点

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

3.应用场景

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

4.代码演示

浅度克隆

package test.com.prototype;

import java.util.ArrayList;
import java.util.List;
/*
 * prototype<原型模式>--clone
 * 原型模式的本质是将“原对象”克隆出一个不同的“目标对象”,
 * 并且“目标对象”保持与“原对象”结构和数据一致
 */
public class Person implements Cloneable{
    private String name;
    private int age;
    private String sex;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;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
    }

    @Override
    protected Person clone() {
        try {
            return (Person)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }  
}
package test.com.prototype;

import java.util.ArrayList;
import java.util.List;
/*
 * 测试代码
 */
public class MainClass {
    public static void main(String[] args) {
        Person per = new Person();
        per.setAge(11);
        per.setName("李强");
        per.setSex("男");
        
        Person per2 = per.clone();
        System.out.println(per.toString());
        System.out.println(per2.toString());
        
        per.setAge(25);
        per.setName("李红");
        per.setSex("女");
        System.out.println(per.toString());
        System.out.println(per2.toString());
    }
}

深度克隆

package test.com.prototype;

import java.util.ArrayList;
import java.util.List;
/*
 * prototype<原型模式>--clone
 * 原型模式的本质是将“原对象”克隆出一个不同的“目标对象”,
 * 并且“目标对象”保持与“原对象”结构和数据一致
 */
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;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", sex=" + sex + ", friends=" + friends + "]";
    }
    
    @Override
    protected Person clone() {
        try {
            Person per = (Person)super.clone();
            //深度克隆
            List<String> newFriends = new ArrayList<String>();
            for(String friend : this.friends){
                newFriends.add(friend);
            }
            per.setFriends(newFriends);
            return per;
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }
}
package test.com.prototype;

import java.util.ArrayList;
import java.util.List;
/*
 * 测试代码
 */
public class MainClass {
    public static void main(String[] args) {
        Person per = new Person();
        per.setAge(11);
        per.setName("李强");
        per.setSex("男");
        List<String> friends = new ArrayList<String>();
        friends.add("张三");
        friends.add("李四");
        per.setFriends(friends);
        
        Person per2 = per.clone();
        System.out.println(per.toString());
        System.out.println(per2.toString());
        
        per.setAge(25);
        per.setName("李红");
        per.setSex("女");
        friends.add("王五");
        friends.add("赵六");
        System.out.println(per.toString());
        System.out.println(per2.toString());
    }
}

 5.相关链接

Java中的Cloneable接口与深拷贝、浅拷贝

原文地址:https://www.cnblogs.com/zheaven/p/9988108.html