2022-09-16设计模式00
请注意,本文编写于 78 天前,最后修改于 78 天前,其中某些信息可能已经过时。

原型模式:

基于原型复制替代对象的创建,用来节省时间.

原型模式,属于创建类型

实际代码我放在了Github: https://github.com/liangtengyu/DesignPatterns-for-Java

应用场景:

学习一个设计模式之前 我们先了解它的使用场景能够帮我们更快的理解它,实现方式:

从概念中我们知道,基于原型复制替代对象的创建,那么什么对象是适合复制的呢? 有以下几种情况:

  • 当一个类需要大量计算获得
  • RPC 获得
  • 网络IO 获得
  • 数据库 获得

用来节省获取对象的时间消耗.有以上几种情况,可考虑使用原型模式.

实现方式:

public  class DatabaseDao {
    //模拟数据库获取数据操作
    public static List<Entity> getList() {

        List<Entity> entityList = new LinkedList<>();
        for (int i = 0; i < 2; i++) {
            entityList.add(new Entity()
                    .setName("name" + i)
                    .setId(i)
                    .setJsonData("{'key':'value'}")
                    .setReferenceData(new ReferenceData("dataname",i+""))
            );
        }
        return entityList;
    }

}
public class Entity {
    private int id;
    private String name;
    private String jsonData;
    private ReferenceData referenceData;

    public ReferenceData getReferenceData() {
        return referenceData;
    }

    public Entity setReferenceData(ReferenceData referenceData) {
        this.referenceData = referenceData;
        return this;
    }

    public int getId() {
        return id;
    }

    public Entity setId(int id) {
        this.id = id;
        return this;
    }

    public String getName() {
        return name;
    }

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

    public String getJsonData() {
        return jsonData;
    }

    public Entity setJsonData(String jsonData) {
        this.jsonData = jsonData;
        return this;
    }

    @Override
    public String toString() {
        return "Entity{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", jsonData='" + jsonData + '\'' +
                ", referenceData=" + referenceData +
                '}';
    }
}
public class ReferenceData {
    private String data;
    private String data2;

    public ReferenceData(String data, String data2) {
        this.data = data;
        this.data2 = data2;
    }

    public String getData2() {
        return data2;
    }

    public void setData2(String data2) {
        this.data2 = data2;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "ReferenceData{" +
                "data='" + data + '\'' +
                ", data2='" + data2 + '\'' +
                '}';
    }
}
@Test
public void test(){
    List<Entity> list = DatabaseDao.getList();
    //输出从数据库中获取的数据
    System.out.println("数据库中获取的数据为:"+list);

    List<Entity> copyList = new ArrayList<>(list);
    System.out.println("复制的数据为:" + copyList);

    list.remove(0);//删除原始List的第一个
    System.out.println("删除后数据库中获取的数据为:"+list);

    System.out.println("删除后复制的数据为:" + copyList);
}

/**
数据库中获取的数据为:[Entity{id=0, name='name0', jsonData='{'key':'value'}', referenceData=ReferenceData{data='dataname', data2='0'}}, Entity{id=1, name='name1', jsonData='{'key':'value'}', referenceData=ReferenceData{data='dataname', data2='1'}}]
复制的数据为:[Entity{id=0, name='name0', jsonData='{'key':'value'}', referenceData=ReferenceData{data='dataname', data2='0'}}, Entity{id=1, name='name1', jsonData='{'key':'value'}', referenceData=ReferenceData{data='dataname', data2='1'}}]
删除后数据库中获取的数据为:[Entity{id=1, name='name1', jsonData='{'key':'value'}', referenceData=ReferenceData{data='dataname', data2='1'}}]
删除后复制的数据为:[Entity{id=0, name='name0', jsonData='{'key':'value'}', referenceData=ReferenceData{data='dataname', data2='0'}}, Entity{id=1, name='name1', jsonData='{'key':'value'}', referenceData=ReferenceData{data='dataname', data2='1'}}]
**/

深浅拷贝

浅拷贝:浅拷贝是将原对象的信息拷贝,拷贝后的对象和原对象指向同一块空间。

深拷贝:原对象的修改不会影响拷贝后的对象。一般有2种常用方式

  • 利用序列化,序列化后,将二进制字节流内容写到一个媒介(文本或字节数组),然后从这个媒介读取数据,原对象写入这个媒介后拷贝给clone对象,原对象的修改不会影响clone对象

  • 通过递归拷贝

拓展:

copy on write 思想 写时复制

概念: 复制对象时,先是基于共享引用,当一方需要修改数据时,才真正复制数据,创建新对象并修改

场景: 读多写少的情况 , 读写分离

缺点:

    1. 频繁修改数据会导致复制多份造成GC压力
    1. 数据一致性有保证了,但是实时性没有保证

本文作者:lty

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!