设计模式——原型模式
介绍
原型模式用户创建复杂的对象,同时可以保证性能。
该模式实现一个原型接口,该接口用于创建当前对象的克隆,当直接创建对象(new)代价比较大时,提供了使用该模式。即先生成一个模型,再根据使用场景将该模型克隆成多个。
意图
使用原型实例创建对象,通过复制原型创建对象。
解决
创建对象需要消耗过多的内存。
优点
-
提高性能
-
逃避构造函数的约束
缺点
- 使用克隆方法时需要通盘考虑,对于全新的类比较容易,但是对于已有的类不一定很容易做到。
- 必须实现
Cloneable
接口 - 逃避构造函数的约束
使用场景
-
资源优化场景
-
类初始化时需要非常多的资源
-
性能和安全要求的场景
-
通过new产生一个对象需要非常繁琐的数据准备
-
一个对象多个修改者场景
UML
示例
Prototype.java
package cn.geoaryblog.design.cretedg.prototype;
import java.util.Map;
public class Prototype implements Cloneable {
private Integer id;
private String name;
private Map works;
public Prototype(Integer id, String name, Map works) {
this.id = id;
this.name = name;
this.works = works;
}
@Override
public String toString() {
return "Prototype{" +
"id=" + id +
", name='" + name + '\'' +
", works=" + works +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Map getWorks() {
return works;
}
public void setWorks(Map works) {
this.works = works;
}
@Override
protected Object clone() {
Prototype prototype = null;
try {
prototype = (Prototype) super.clone();
} catch (Exception e) {
e.printStackTrace();
}
return prototype;
}
}
PersonPrototype.java
package cn.geoaryblog.design.cretedg.prototype;
import java.util.Map;
public class PersonPrototype extends Prototype {
public PersonPrototype(Integer id, String name, Map works) {
super(id, name, works);
System.out.println("构造函数");
}
public String show(){
return this.toString();
}
}
Client.java
package cn.geoaryblog.design.cretedg.prototype;
import java.util.HashMap;
import java.util.Map;
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
String name = "张三";
int id = 20;
Map works = new HashMap();
works.put("200810-201801", "北京");
works.put("202001-现在", "上海");
PersonPrototype personPrototype = new PersonPrototype(id, name, works);
PersonPrototype person1 = (PersonPrototype) personPrototype.clone();
PersonPrototype person2 = (PersonPrototype) personPrototype.clone();
System.out.println(person1);
System.out.println(person2);
System.out.println(person1.hashCode()); // 989110044
System.out.println(person2.hashCode()); // 424058530
System.out.println("person1==person2?"+(person1==person2));
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】