架构师训练营第三周作业

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

本来想用让子弹飞的截图做封面,结果不知道是因为侵权还是敏感,被风控系统拦截了,气死了,这周不用封面了。

单例模式的九种五种实现

懒汉&饿汉

  1. 饿汉的缺点在于不支持延迟加载,这里我觉得如果单例加载时间长的话反而应该在启动的时候加载,如果运行时加载反而影响体验,本末倒置。

  2. 懒汉优点是支持延迟加载,缺点是getInstance方法使用了锁导致性能一般。





双重检查

  1. 上面讲了懒汉式因为使用锁而导致并发条件下的性能问题,双重检查可以通过细粒度锁只在创建instance的时候加锁从而规避性能问题。

  2. 这里需要注意:

J2SE 1.4或更早的版本中使用双重检查锁有潜在的危险,有时会正常工作:区分正确实现和有小问题的实现是很困难的。取决于编译器,线程的调度和其他并发系统活动,不正确的实现双重检查锁导致的异常结果可能会间歇性出现。重现异常是十分困难的。

J2SE 5.0中,这一问题被修正了。volatile关键字保证多个线程可以正确处理单件实例。

以上引用自维基百科https://zh.wikipedia.org/wiki/%E5%8F%8C%E9%87%8D%E6%A3%80%E6%9F%A5%E9%94%81%E5%AE%9A%E6%A8%A1%E5%BC%8F





静态内部类&枚举

  1. 静态内部类利用了jvm类加载的机制,实现了延迟加载。即只有调用getInstance才会加载静态内部类创建实例,创建实例也通过jvm来控制。

  2. 枚举的写法非常简单。



组合模式

项目仓库:

https://github.com/wuyueandrew/designpattern1

这个实现比较简单,GUINode接口声明一个打印节点和子节点的方法,每个节点都必须实现。WinForm和Frame类里都有子节点的容器。入口类是BasicApplication,输出如下:



用户头像

Geek_2dfa9a

关注

还未添加个人签名 2019.02.18 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第三周作业