原型模式
标签:设计模式

原型模式

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

1. 原型模式的特点

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

2. 使用方式

Person

package com.liuyao;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;

import java.util.ArrayList;
import java.util.List;

/**
 * @author liuyao
 * @date 2018/07/30
 */

@Data
@AllArgsConstructor
@ToString
public class Person implements Cloneable{
    private int age;
    private String name;
    private List<String> firendsName;

    /**
     * 浅克隆,对于引用,直接复制地址,不会新建对象,多个对象公用一个引用对象
     * @return
     */
    @Override
    protected Person clone(){
        try {
            return (Person) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 深克隆,需处理引用类型的复制
     * @return
     */
    protected Person cloneDeep(){
        try {
            Person person= (Person) super.clone();
//            新建List对象
            List<String > firends=new ArrayList<>();
            for (String f:person.getFirendsName()) {
                firends.add(f);
            }
            person.setFirendsName(firends);
            return person;
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }
}

为避免set,get等占用太多空间,使用了Lombok,主要是继承Cloneable接口,覆写clone()方法


Main

package com.liuyao;

import java.util.ArrayList;
import java.util.List;

public class Main {

    public static void main(String[] args) throws CloneNotSupportedException {
        List<String> friends=new ArrayList<>();
        friends.add("aaa");
        friends.add("bbb");
        friends.add("ccc");
        Person person=new Person(10,"zhangsan",friends);
        System.out.println(person);

        System.out.println("=== 克隆完 ===");
        Person shallowPerson=person.clone();
        System.out.println(shallowPerson);

        System.out.println("=== 对原型的基本类型修改 ===");
        person.setAge(12);
        System.out.println(person);
        System.out.println(shallowPerson);

        System.out.println("=== 对原型的引用类型修改(浅克隆) ===");
        friends.add("ddd");
        System.out.println(person);
        System.out.println(shallowPerson);

        System.out.println("=== 对原型的引用类型修改(深克隆) ===");
        Person deepPerson=person.cloneDeep();
        friends.add("fff");
        person.setAge(9);
        System.out.println(person);
        System.out.println(shallowPerson);
        System.out.println(deepPerson);
    }
}

3. 应用场景

  1. 在创建对象的时候,我们不只是希望被创建的对象继承其类的基本结构,还希望继承原对象的数据。
  2. 希望对目标对象的修改不影响原型对象(采用深克隆)。
  3. 隐藏克隆操作的细节,很多时候对象的克隆会涉及到类本身的数据。
  • 3 min read

CONTRIBUTORS


  • 3 min read