背景
本人从事开发工作也有多年,目前坐标湖南长沙,以前在各种平台也发过一些文章但是都没有坚持下来;
这个系列是要写设计模式的,将23大设计模式逐一用自己的理解加例子写出来。
其一、眨眼就到了而立之年,觉得自己记忆力也是下降久做过的东西总是记不起,果然是好记性不如烂笔头。
其二、这么多年白嫖了网上很多的文章,视频,一直觉得应该分享一些东西但总是沉不下心去做。
其三、可能写的不好至少也留下一些东西,也是希望能帮助到一些朋友。
说明
在我的理解里:每一种设计模式仅仅是一种思想,并不是说每个设计模式之间就会有很明确的边界。有时候你会觉得某两种设计模式实现起来特别像,其实是因为有些的设计模式延伸出来的仅仅是着重的看待点不一样而已;学习设计模式一定不是只学习固定的实现方式。要了解设计思想,然后在项目中灵活得进行最适合设计。
单例模式
单例模式: 只允许实例一个对象。
懒汉:用到的时候才加载
饿汉:不管用不用到都先实例化
直接上一段实现代码
经典双重判断锁实现懒汉模式
public class LazySingleton {
//加volatile为了防止代码重排序引发的执行顺序逻辑错误
private static volatile LazySingleton instance;
//private不能直接new LazySingleton()创建。
private LazySingleton() {
if (instance != null) {
throw new RuntimeException("can't newInstance");
}
}
public static LazySingleton getInstance() {
//经典双重判断第一重判断为了已经创建就不需要再进入synchronized提高调用的性能
if (instance == null) {
//加synchronized是为了防止多线程并发穿透instance == null
synchronized (LazySingleton.class) {
//第二重判断主要是穿透后synchronized等着加一个判断没有初始化就初始化,已初始化就直接返回
if (instance == null) {
instance = new LazySingleton();
return instance;
}
}
}
return instance;
}
饿汉模式
public class HungrySingleton {
private static HungrySingleton instance = new HungrySingleton();
private HungrySingleton() {
if (instance != null) {
throw new RuntimeException("can't newInstance");
}
}
public static HungrySingleton getInstance() {
return instance;
}
public int log() {
Log.d("HungrySingleton hashCode:" + this.hashCode());
return this.hashCode();
}
}
这里就不贴内部类,以及枚举实现单例的方法了。
也不谈反射,反序列化穿透单例,做到相对安全毕竟没有绝对安全。
代码链接
吐槽
距离发之前的7大设计原则已经好些天,本想很快把这个系列的代码以及文章写出来,但忙着进行考试…(毕业近十年后突然决定重新报了一个自学考试,让自己恶补一下大学计算机相关基础知识),想写的知识相关代码其实敲了一些,文章一直跟不上,还是不太习惯写文章,怕自己说不清楚,于是准备多打字说明,如果对说明文字有不理解希望可以指出。
TODO…我本想复制一份文章公共部分,结果改错覆盖了…这篇文章又重写一遍…