【设计模式】原型模式

原型模式就像"细胞分裂"或"复印机":当你需要创建一个新对象时,不是通过 new 重新构造,而是复制一个现有对象(原型),再修改细节。核心是 clone() 方法,类似"复制粘贴",能快速生成新对象,避免重复初始化开销。

案例代码:基本实现

java 复制代码
// 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; }
}
java 复制代码
// 使用示例
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
    }
}

应用场景案例:缓存预加载配置

场景:系统启动时预加载配置模板,后续直接克隆配置,避免重复读取文件或数据库。

java 复制代码
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
    }
}
相关推荐
Coder_Boy_4 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble5 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟5 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖5 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
qq_12498707536 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_6 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.6 小时前
Day06——权限认证-项目集成
java
瑶山6 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy7 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法
2301_818732067 小时前
前端调用控制层接口,进不去,报错415,类型不匹配
java·spring boot·spring·tomcat·intellij-idea