原型模式就像“细胞分裂”或“复印机”:当你需要创建一个新对象时,不是通过 new 重新构造,而是复制一个现有对象(原型),再修改细节。核心是 clone() 方法,类似“复制粘贴”,能快速生成新对象,避免重复初始化开销。
案例代码:基本实现
// 1. 实现 Cloneable 接口(标记可克隆)
class Shape implements Cloneable {
private String type;
public Shape(String type) {
this.type = type;
}
// 2. 重写 clone() 方法(浅拷贝)
@Override
public Shape clone() {
try {
return (Shape) super.clone();
} catch (CloneNotSupportedException e) {
return null;
}
}
public String getType() { return type; }
}
// 使用示例
public class Main {
public static void main(String[] args) {
Shape circlePrototype = new Shape("Circle");
// 克隆一个新对象(而非 new)
Shape newCircle = circlePrototype.clone();
System.out.println(newCircle.getType()); // 输出: Circle
}
}
应用场景案例:缓存预加载配置
场景:系统启动时预加载配置模板,后续直接克隆配置,避免重复读取文件或数据库。
import java.util.HashMap;
import java.util.Map;
// 配置类(支持深拷贝)
class AppConfig implements Cloneable {
private Map<String, String> settings = new HashMap<>();
public void setSetting(String key, String value) {
settings.put(key, value);
}
public String getSetting(String key) {
return settings.get(key);
}
@Override
public AppConfig clone() {
try {
AppConfig copy = (AppConfig) super.clone();
// 深拷贝:手动复制引用对象(如 Map)
copy.settings = new HashMap<>(this.settings);
return copy;
} catch (CloneNotSupportedException e) {
return null;
}
}
}
// 配置缓存池
class ConfigCache {
private static Map<String, AppConfig> cache = new HashMap<>();
static {
// 初始化时加载默认配置
AppConfig defaultConfig = new AppConfig();
defaultConfig.setSetting("theme", "dark");
defaultConfig.setSetting("font", "Arial");
cache.put("default", defaultConfig);
}
public static AppConfig getConfig(String key) {
return cache.get(key).clone(); // 返回克隆副本
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
// 获取配置克隆(避免修改影响缓存中的原型)
AppConfig userConfig = ConfigCache.getConfig("default");
userConfig.setSetting("theme", "light"); // 修改不影响原配置
System.out.println(userConfig.getSetting("theme")); // 输出: light
System.out.println(ConfigCache.getConfig("default").getSetting("theme")); // 输出: dark
}
}