写点什么

第三周总结

用户头像
丿淡忘
关注
发布于: 2020 年 06 月 24 日

单例模式

为什么要使用单例

单例设计模式(Singleton Design Pattern)

一个类只允许创建一个对象(或者实例)



为什么使用单例 单例解决的问题 案例1 41.cs

所有日志都写入同一个文件 共享资源

两个线程同时给一个变量加1 结果变量 可能只加了1

相互覆盖



?加互斥锁?

no 对象级别的锁 不同对象 调用 不会启作用



使用类级别的锁



分布式锁



并发队列



单例模式



表示全局唯一类

数据在系统中只应保存一份,那就比较适合设计为单例类

类似 配置信息类 ID生成器



如何实现一个单例

1.构造函数 需要 private 访问

2.考虑对象创建时的线程安全

3.考虑是否支持延迟加载

4.考虑GetInstance() 性能是否高(是否加锁)



实现方式

1.饿汉式

类加载的时候,instance 静态实例就已经创建并初始化好

线程安全

不支持延迟加载

采用饿汉式实现方式,将耗时的初始化操作

提前到程序启动的时候完成,这样就能避免在程序运行的时候,再去初始化导致的性能问题



按照Fail-fast 有问题及早暴露



2.懒汉式

懒汉式需要加锁 频繁加锁释放锁



3.双重检测

饿汉式不支持延迟加载,懒汉式有性能问题,不支持高并发



4.静态内部类



5.枚举

基于Java枚举特性

工厂模式

简单工厂



public class RuleConfigSource {

public RuleConfig load(String ruleConfigFilePath) {

String ruleConfigFileExtension = getFileExtension(ruleConfigFilePath);

IRuleConfigParser parser = null;

if ("json".equalsIgnoreCase(ruleConfigFileExtension)) {

parser = new JsonRuleConfigParser();

} else if ("xml".equalsIgnoreCase(ruleConfigFileExtension)) {

parser = new XmlRuleConfigParser();

} else if ("yaml".equalsIgnoreCase(ruleConfigFileExtension)) {

parser = new YamlRuleConfigParser();

} else if ("properties".equalsIgnoreCase(ruleConfigFileExtension)) {

parser = new PropertiesRuleConfigParser();

} else {

throw new InvalidRuleConfigException(

"Rule config file format is not supported: " + ruleConfigFilePath);

}



String configText = "";

//从ruleConfigFilePath文件中读取配置文本到configText中

RuleConfig ruleConfig = parser.parse(configText);

return ruleConfig;

}



private String getFileExtension(String filePath) {

//...解析文件名获取扩展名,比如rule.json,返回json

return "json";

}

}



大部分工厂类都是以“Factory”这个单词结尾的

工厂类中创建对象的方法一般都是 create 开头



如果 parser 可以复用,为了节省内存和对象创建的时间,我们可以将 parser 事先创建好缓存起来

当调用 createParser() 函数的时候,我们从缓存中取出 parser 对象直接使用



如果 if 分支并不是很多,代码中有 if 分支也是完全可以接受的



工厂方法(Factory Method)



抽象工厂



封装变化:创建逻辑有可能变化,封装成工厂类之后,创建逻辑的变更对调用者透明。

代码复用:创建代码抽离到独立的工厂类之后可以复用。

隔离复杂性:封装复杂的创建逻辑,调用者无需了解如何创建对象。

控制复杂度:将创建代码抽离出来,让原本的函数或类职责更单一,代码更简洁。





用户头像

丿淡忘

关注

还未添加个人签名 2018.05.23 加入

还未添加个人简介

评论

发布
暂无评论
第三周总结