一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

GoF设计模式:原型模式详解

时间:2026-05-22 08:30:01 编辑:袖梨 来源:一聚教程网

当对象创建过程复杂耗时,需要大量相似实例时,原型模式通过复制现有对象来提升效率,避免重复初始化。本文将详解其实现原理与典型应用场景。

前言

为什么需要原型模式?

在某些情况下,直接使用 new 创建对象并不高效——可能需要访问数据库、调用接口或执行复杂计算。当需要生成大量相似对象时,这个问题尤为突出:

// 示例:创建与现有角色相似的新角色,仅名称不同
GameCharacter warriorTemplate = loadFromDatabase("warrior"); // 耗时操作
// 批量创建时重复查询数据库效率低下

这种情况下,"复制"比"新建"更高效,这正是原型模式的价值所在。

概念

作为创建型设计模式,原型模式的核心在于通过复制现有对象创建新实例,避免重复执行初始化逻辑(如数据库查询、网络请求等)。

该模式包含三个关键组成部分:

  1. 抽象原型:定义克隆方法 clone()
  2. 具体原型:实现克隆逻辑,返回自身副本
  3. 原型注册表:集中管理常用原型,按需提供克隆副本

抽象原型定义接口,具体原型实现拷贝,注册表管理缓存,客户端通过键值获取克隆对象。

拷贝方式分为两类:

  1. 浅拷贝:仅复制基本类型字段,引用类型共享内存地址
  2. 深拷贝:完全复制所有字段,新旧对象完全独立
// 浅拷贝示例:共享List引用
class ShallowPrototype {
	private String name;
	private List tags;	@Override
	public ShallowPrototype clone() {
		ShallowPrototype copy = new ShallowPrototype();
		copy.name = this.name;
		copy.tags = this.tags;
		return copy;
	}
}// 深拷贝示例:创建独立List
class DeepPrototype {
	private String name;
	private List tags;	@Override
	public DeepPrototype clone() {
		DeepPrototype copy = new DeepPrototype();
		copy.name = this.name;
		copy.tags = new ArrayList<>(this.tags);
		return copy;
	}
}

原型模式的核心价值在于规避高成本的对象创建过程。选择深拷贝还是浅拷贝,取决于引用字段是否需要独立性——错误选择可能导致性能浪费或共享数据问题。

实现

GoF 标准实现

标准实现包含定义 Prototype 接口,具体类实现 clone() 方法,配合原型注册表统一管理:

// 抽象原型接口
public interface Prototype {
	Prototype clone();
}// 具体原型类
public class ConcretePrototype implements Prototype {
	private String data;
	private List items;	public ConcretePrototype(String data, List items) {
		this.data = data;
		this.items = items;
	}	@Override
	public Prototype clone() {
		return new ConcretePrototype(this.data, new ArrayList<>(this.items));
	}
}// 原型注册表
public class PrototypeRegistry {
	private Map prototypes = new HashMap<>();	public void register(String key, Prototype prototype) {
		prototypes.put(key, prototype);
	}	public Prototype get(String key) {
		Prototype prototype 
                        

相关文章