单例设计模式(Singleton Design Pattern)
构造函数需要是 private 访问权限的,这样才能避免外部通过 new 创建实例;考虑对象创建时的线程安全问题;考虑是否支持延迟加载;考虑 getInstance() 性能是否高(是否加锁)。
在类加载的时候,instance 静态实例就已经创建并初始化好了,所以,instance 实例的创建过程是线程安全的。不过,这样的实现方式不支持延迟加载(在真正用到 IdGenerator 的时候,再创建实例)
如果初始化耗时长,那我们最好不要等到真正要用它的时候,才去执行这个耗时长的初始化过程,这会影响到系统的性能(比如,在响应客户端接口请求的时候,做这个初始化操作,会导致此请求的响应时间变长,甚至超时)。采用饿汉式实现方式,将耗时的初始化操作,提前到程序启动的时候完成,这样就能避免在程序运行的时候,再去初始化导致的性能问题。
3. 双重检测
从业务概念上,有些数据在系统中只应该保存一份,就比较适合设计为单例类
原型模式
概念和使用场景:
有的对象创建成本比较大,特别是涉及到复杂计算,或者需要从rpc,网络,数据库,文件系统等慢速io中读取的时候。可以用原型模式,从其他已有对象中直接拷贝,而非每次创建新对象时,都重复执行这些耗时的操作。
应用:
有个服务器,有个很大的数据库缓存,定时更新,那么每次更新不用都从新从数据库获取;而只要从数据库获取,上次更新后的变化,所以可以利用原型模式,先生成原型,然后在merge差异。
如果这个缓存不大,用深拷贝简单;如果缓存大,那么用浅拷贝,修改的地方再用深拷贝。
深拷贝和浅拷贝:
浅拷贝仅仅拷贝索引;深拷贝还包括索引指向的内容;