1.单例模式:确保一个类只有一个实例,并且自行实例化并向整个系统提供整个实例。优点:
构造函数私有化,定义静态函数获得实例就不多说了,这里着重说一下volatile:volatile本质是在告诉jvm当前变量在寄存器中的值是不确定的,需要从内存中读取,synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住.(首先我们要先意识到有这样的现象,编译器为了加快程序运行的速度,对一些变量的写操作会先在寄存器或者是CPU缓存上进行,最后才写入内存。而在这个过程,变量的新值对其他线程是不可见的.而volatile的作用就是使它修饰的变量的读写操作都必须在内存中进行!) 再就是这个双重判断null :这是因为如果线程A进入了该代码,线程B 在等待,这是A线程创建完一个实例出来后,线程B 获得锁进入同步代码,实例已经存在,木有必要再创建一个,所以双重判断有必要。
2.Builder 模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。给Person类添加一个静态Builder类,然后修改Person的构造函数,如下:
从上边代码我们可以看到我们在Builder类中定义了一份跟Person类一样的属性,通过一系列的成员函数进行赋值,但是返回的都是this,最后提供了一个build函数来创建person对象,对应的在Person的构造函数中,传入了Builder对象,然后依次对自己的成员变量进行赋值。此外,Builder的成员函数返回的都是this的另一个作用就是让他支持链式调用,使代码可读性大大增强。于是我们就可以这样创建Person对象:
可见大量框架运用了Builder 设计模式,总结一下吧:
1).定义一个静态内部类Builder,内部成员变量跟外部一样;
2).Builder通过一系列方法给成员变量赋值,并返回当前对象(this);
3).Builder类内部提供一个build方法方法或者create方法用于创建对应的外部类,该方法内部调用了外部类的一个私有化构造方法,该构造方法的参数就是内部类Builder;
4).外部类提供一个私有化的构造方法供内部类调用,在该构造函数中完成成员变量的赋值。
观察者模式
1. 理论概念:定义对象间的一种一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都能得到通知并被自动更新。1).观察者,我们称它为Observer,有时候我们也称它为订阅者,即Subscriber;2).被观察者,我们称它为Observable,即可以被观察的东西,有时候还会称之为主题,即Subject。
2.我们来模拟上边的场景,先定义一个Weather的类:
3.然后定义我们的被观察着,我们希望它能够通用,所以定义成泛型,内部应该暴露出register和unRegister供观察者订阅和取消订阅,至于观察者的保存,我们用ArrayList即可,另外,当主题发生变化的时候,需要通知观察者来做出响应,还需要一个notifyObservers方法,具体实现如下:
4.而我们的观察者只需要实现一个观察者的接口Observer,该接口也是泛型的。
5.一旦订阅的主题发生了变化,就会调用该接口。
用一下,我们定义一个天气变化的主题,也就是被观察者,再定义两个观察者来观察天气的变化,一旦变化了就打印出天气的情况,注意,一定要用register方法来注册,否则观察者收不到变化的信息,而一旦不感兴趣,就可以调用unregister方法。
6. 下面是输出语句:
7.开发中很多其他的方式也用到观察者模式。
8. Android里面的典型例子叫点击监听器 - onClickListener, 对设置onClickListener来说, View是被观察者,onClickListener是观察者,两者通过setOnClickListener()方法来达成订阅关系。订阅之后用户点击按钮的瞬间,Android Framework 就会将点击事件发送给已经注册的OnClickListener。采取这样被动的观察方式,既省去了反复检索状态的资源消耗,也能够得到最高的反馈速度。
网友评论