JAVA设计模式-创建模式-多例模式

    技术2026-08-28  9

    多例模式Multition

    为什么要有设计模式?什么是多例模式?为什么要有多例模式?多例模式的实现方式鸣谢

    为什么要有设计模式?

    一个有价值的系统总是会因为需求的变化而变化,可能是原有需求的修改,也可能是新需求的增加。于是可怜的猿们就得修改原来的代码。好的架构和设计可以让我们的代码结构具有良好的扩展性,在满足需求变化的同时仅需要修改尽可能少的代码,可以将需求变化对原系统的影响降到很低。设计模式就是人们对于良性架构设计的经验总结。

    什么是多例模式?

    多例模式其实是单例模式的推广,一个类允许有限个实例,并且由这个类自己创建,管理和提供实例。

    为什么要有多例模式?

    还用我在单例模式里的例子,系统需要把配置放在配置文件,并且需要一个读取配置的工具类,但是这次是有多个配置文件,因为很多时候把整个系统的配置全部放在一个配置文件不合理,有些配置是全局模块都会用的,有的配置仅仅是局部一个或几个模块使用。所以每个配置文件应当有一个配置管理器的实例。

    多例模式的实现方式

    /** * 枚举发方式的多例配置管理器 */ public class ConfigManager { public enum ConfigType { DB_CONFIG("db.cfg"), CACHE_CONFIG("cache.cfg"), EMAIL_CONFIG("email.cfg"), ; private final String configFileName; private final ConfigManager instance; ConfigType(String configFileName) { this.configFileName = configFileName; this.instance = new ConfigManager(configFileName); } } /** * 将配置读取到内存 */ private final Properties configs; private ConfigManager(String configFileName) { System.out.println("实例化配置管理器:" + configFileName); configs = new Properties(); try { configs.load(ConfigManager.class.getClassLoader().getResourceAsStream(configFileName)); } catch (IOException e) { throw new RuntimeException(e.getMessage(), e); } } /** * 取得配置文件名 * @return */ public static String getConfigFileName(ConfigType configType) { return configType.configFileName; } /** * 取得实例 * @return */ public static ConfigManager getInstance(ConfigType configType) { return configType.instance; } /** * 取得配置 * @param configKey * @return */ public String getConfigValue(String configKey) { return configs.getProperty(configKey); } } /** * 客户端 */ public class CacheClient { /** * 打印配置文件名 */ public void printConfigFileName() { System.out.println("配置文件名:" + ConfigManager.getConfigFileName(ConfigManager.ConfigType.CACHE_CONFIG)); } /** * 打印配置值 * @param key */ public void printConfigValue(String key) { System.out.println(ConfigManager.getInstance(ConfigManager.ConfigType.CACHE_CONFIG).getConfigValue(key)); } public static void main(String[] args) { CacheClient client = new CacheClient(); client.printConfigFileName(); client.printConfigValue("key1"); } }

    这里我仅仅使用了枚举方式,其实其他单例的实现方式都可以扩展为多例。掌握好单例的思想,稍加扩展就可以变为多例模式了。

    鸣谢

    非常感谢你花时间阅读本文章,本人水平有限,如果有什么说的不对的地方,欢迎指正。欢迎各位留言讨论,希望小伙伴们都能每天进步一点点。

    Processed: 0.010, SQL: 9