分享程序网
首页
  • java
微服务
微前端
环境搭建
数据库
设计模式
算法
软件
解决问题
链接
首页
  • java
微服务
微前端
环境搭建
数据库
设计模式
算法
软件
解决问题
链接
  • 创建模式

    • 单例模式
    • 工厂方法模式
    • 抽象工厂模式
    • 原型模式
    • 建造者模式
  • 结构模式

    • 适配器模式
    • 桥接模式
    • 组合模式
    • 装饰器模式
    • 门面模式
    • 享元模式
    • 代理模式
  • 行为模式

    • 责任链模式
    • 命令模式
    • 迭代器模式
    • 策略模式
    • 模板方法模式

原型模式

还记得单例模式中的ModelMapper吗?对“对象”的属性进行拷贝,原型模式的作用是什么?就是在于复制原型对象。以系统中已存在的一个对象为原型,直接基于内存二进制流进行复制,不需要再经历耗时的对象初始化过程(不调用构造函数),性能会提升很多。

经常我们会写很多get,set方法,我们通常会用lombok来帮我们进行简化。但是如果两个对象直接的属性赋值呢?很多人都会做xx.set(yy.get())的操作。

拿用户类举例:

package com.design.prototype;

public class User implements Cloneable {
	
	@Override
	protected User clone() {
		try {
			return (User) super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return null;
	}

	private String username;
	
	private String password;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

}

这里是通过二进制流赋值,重新分配一个内存块,效率高。但是如果存在引用对象属性,则会指向同一对象的引用。

import lombok.Data;

import java.util.List;

@Data
public class User implements Cloneable {
	
	@Override
	protected User clone() {
		try {
			return (User) super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return null;
	}

	private String username;
	
	private String password;

	private List<String> roles;

}

通过使用序列化的方式使用深度拷贝


import lombok.Data;

import java.io.*;
import java.util.List;

@Data
public class User implements Cloneable, Serializable {
	
	@Override
	protected User clone() {
		try {
			return (User) super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return null;
	}

	public User deepClone() {
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		ObjectOutputStream oos = null;
		try {
			oos = new ObjectOutputStream(bos);
			oos.writeObject(this);
			ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
			ObjectInputStream ois = new ObjectInputStream(bis);
				return (User)ois.readObject();
		} catch (IOException | ClassNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}

	private String username;
	
	private String password;

	private List<String> roles;

}

如果是单例模式也会被原型模式破坏,所以单例模式肯定不能实现拷贝功能。

就目前开发环境来说,用的并不多,大部分人会选择MapStruct或者ModelMapper等

Last Updated:
Contributors: chengli, clcheng
Prev
抽象工厂模式
Next
建造者模式