目的:确保一个类别只会产生一个物件
废话不多说马上来看Singleton怎么实作
这个写法在Android Memory Leak及衍伸问题01有提到
我打算把每个问题都拆开来讨论并且个别讨论解决方案
避免在一篇文章中提到多个问题而导致读者混淆解决方案
实作完了马上就来应用一下比较一下差异
一般状况
首先在一般没有使用Singleton的情况,我们任何一个地方使用到物件都必须new一个新的
在这个範例中我们在一个Activity呼叫了3个API,在没有Singleton的状态下,就产生了3个不同的物件
使用Singleton
接下来我们导入Singleton Pattern在同样的情境下使用,所有地方都是使用同一个物件。在这个範例中我们物件佔用的记忆体空间就是原本的三分之一了
一开始讲到的目的(确保一个类别只会产生一个物件),可能会有个疑问,只产生一个这件事有这么重要吗?
我自己认为,平常很小规模的开发或者记忆体很充足的情况,或许你做不做都感觉不到差异,就如我们刚刚举的一个例子规模很小,初始化一次根本佔用不了多少时间,当然做不做从一般的使用或者测试下,是没有办法察觉的
举的例子讨论一下
我们假设这个物件在初始化的时候需要很高的成本
这边我在初始化的时候动作加上需要读取一张3MB的图片资源档
一般状况
可以看到在两次初始化之间可用记忆体直接少3%了
至于我是怎么Log记忆体的可以去爬爬文,我是看这个StackOverFlow
使用Singleton
在这边两次初始化之间记忆体几乎没有变动,主要原因就是用Singleton Pattern后,sInstance物件还在,所以根本不需要再重新new一个新物件,当然就不会有多的记忆体被佔用
看完这篇其实也是一个结论,从平常就开始养成良好的撰写习惯,避免Project越养越肥,到时候重构、优化效能做到痛哭流涕
Android Singleton 单例模式应用02(Multi-Thread、Synchronize)