吹前序
作为一名程序员,想要看出与别人的差距,除了必备吹水技能,斗图技能,那就还剩最重要的一点——代码能力了!那么如何才能在众多段子手,老司机中通过自己的代码成功装逼呢,作为程序员的你,必须要了解,学习,使用的杀手锏来了 设计模式
什么是设计模式
你可以这样理解它:
- 程序的设计模式通常来说没有一个统一的定义,都是开发人员不断的在开发过程中不断的积累,总结出来的一种可以复制重用的方案
- 设计模式是对程序设计人员经常遇到的设计问题的可再现的解决方案
- 设计模式建立了一系列描述如何完成软件开发领域中特定任务的规则
- 设计模式关注与复用可重复出现的结构设计方案
设计模式识别并确定类和实例层次上或组件层次上的抽象关系
总结:
设计模式在设计者是一种流行的思考设计问题的方法,是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结。优点
使用了设计模式,是为了使代码具有可重用性,让代码更容易被他人理解和保证代码的可靠性。
同时,设计模式在不同的语言中存在着一些差异,在这里,总结学习几种Android相关的设计模式(爱哥的设计模式毕竟是无法超越的)
单例模式
使用场景
在程序中,应该只存在一个ImageLoader全局对象,在ImageLoader中又
会存在网络缓存,线程池,请求队列等,非常的消耗资源,因此,我们不能
让他去构造多个实例,这种不能自由构造对象的情况,就是单列模式使用的
场景
定义
确保某一个类只有一个实例,并且需要自行实例化然后向系统提供这个实例
共同构成
- 私有的构造方法
- 私有的静态变量(与该类的实例相同)
- 共有的静态方法返回实例
实现的类型
- 饿汉模式
- 静态内部类
- 懒加载
饿汉式
当类加载的时候就初始化这个实例,创建单例实例简单容易,但是有一个弊
端,这个实例有可能没有被使用
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton(){
}
public static Singleton getSingleton(){
return singleton;
}
}
这种方式创建的单例模式,除了上面说的弊端,同时也没有任何的异常处理
静态内部类
public class Singleton {
private static class SingletonHolder {
private static final Singleton singleton = new Singleton();
}
private Singleton(){
}
public static Singleton getSingleton(){
return SingletonHolder.singleton;
}
}
静态内部类第一次加载的时候并不会初始化实例,只有在getSingleton()的时候,才会
去创建实例。因此这种方式不仅可以保证线程的安全,也能够保证单例对象的唯一性,同时
也延迟了单例的实例化,所以这是推荐的使用方式。
懒加载
当我们需要去使用这个类的实例的时候再来创建。
public class Singleton {
private static Singleton singleton = null;
private Singleton(){
}
public static Singleton getSingleton(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
这种方式的创建实例在单线程中是没有问题,但是在多线程中就会造成创建
多个实例,所以线程是不安全的,我们需要改进一下。
public class Singleton {
private static Singleton singleton = null;
private Singleton(){
}
public static synchronized Singleton getSingleton(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
上面我们经过优化修改,解决了多线程创建多个实例的问题,并且提供了线程的安全。那么你是不是以为大功告成了呢?嘿嘿,不要太年轻了,仔细看:
在加入了synchronized 关键字之后,它修饰的是getSingleton()方法,所以这会对性能造成影响,降低程序的性能!因为我们每一次调用getSingleton()方法的时候都会去同步,造成了不必要的资源消耗,这也是懒汉式存在的最大的问题,所以这种模式一般不建议使用。
我们还需要对上面的代码进行优化:
public class Singleton {
private static Singleton singleton = null;
private Singleton(){
}
public static Singleton getSingleton(){
if(singleton == null){
synchronized(Singleton.class){
if(singleton == null){
singleton = new Singleton();
}
}
}
return singleton;
}
}
再一次经过优化我们的代码,可以看出:getSingleton方法进行了两次判空。第一次是为了不必要的同步,第二次的判断null则是为了在空的情况下去创建实例。
此时,我们既可以在需要的时候才去初始化单例,又能够保证线程安全,同时还能够保证单例对象初始化之后调用getSingleton方法不会进行同步锁
总结
单例模式是一种使用频率较高的设计模式,出于效率考虑,推荐使用懒加载模式以及静态内
部类模式
优点:
- 单例模式在内存中只存在一个实例,内存开支小,
- 避免对资源的多重处理
- 可以设置全局访问类,处理及优化共享资源
缺点:
- 没有接口,扩展难
- 如果持有context对象,容易引发内存泄漏(注意传递的context最好是Application Context)