JAVA 设计模式,多例模式

举报
二当家的白帽子 发表于 2021/08/22 09:05:02 2021/08/22
【摘要】 为什么要有设计模式?一个有价值的系统总是会因为需求的变化而变化,可能是原有需求的修改,也可能是新需求的增加。于是可怜的猿们就得修改原来的代码。好的架构和设计可以让我们的代码结构具有良好的扩展性,在满足需求变化的同时仅需要修改尽可能少的代码,可以将需求变化对原系统的影响降到很低。设计模式就是人们对于良性架构设计的经验总结。 什么是多例模式?多例模式其实是单例模式的推广,一个类允许有限个实例,...

为什么要有设计模式?

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


什么是多例模式?

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


为什么要有多例模式?

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


多例模式的实现方式

/**
 * 枚举发方式的多例配置管理器
 */
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");
	}
}

运行结果

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


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。