为什么我要看这个。
回顾我以前写的3个app的代码。我普遍都喜欢把代码写在一个activity里面这样非常不好,可读性差,扩展不行。
顺便学习这些设计模式的时候可以结合安卓里面组件的使用来复习。

1.工厂/抽象工厂模式:通过给出名字,生成具体子类。在开发中似乎遇到过,但是我忘了。跟c++的虚函数差不多?
可扩展性好。菜鸟教程的例子不错,加入xx功能只需要在初始类中加入,然后在子类实现就行了
factory用过而已。代码都是格式化了。
仅仅停留在怎么用。
2.单例模式:
保证一个xx类有且只有一个实例,
实际操作:
1.创建一个静态的xx=new xx()
2.菜鸟教程里面把默认构造函数做成了私有。(按道理这样经常用来出题报错)
3.生成一个静态的返回值是该xx类的get函数。
4.xx obj=xx.get();
疑问:可以这样吗?
扩展:懒汉式1:不支持多线程,没有加锁

懒汉式2:加入synchronized修饰get函数,保证只有一个实例。

饿汉式:没太看明白,classloader又是什么机制

是否 Lazy 初始化:

是否多线程安全:

实现难度:

描述:这种方式比较常用,但容易产生垃圾对象。
优点:没有加锁,执行效率会提高。
缺点:类加载时就初始化,浪费内存。
它基于 classloader 机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用 getInstance 方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 显然没有达到 lazy loading 的效果。

双重校检锁:不想复制黏贴:
优点:就是性能好

登记式静态类:
延迟加载?
枚举:
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}

代码看上去非常简短。可以深入
有什么用嘛?我在开发音乐播放器app的时候需要用到一个进度条。这个如果做成单例模式,就不会出现空指针问题了,因为我的代码结构不行,所以通知栏切歌是新建一个activity。导致原来的子线程还在继续调用原activity的view。但是已经重绘所以报bug。
我的解决办法:在pause()的时候取消子线程timer
学了这个以后:可不可以把这个控制进度条的做成一个单例对象(todo)


3.建造者模式
用过:通知栏通知service,数据库的创建,用到了builder
截图小子。。。

就算被说只会截图,我也要截图,这里刚好也看到游标工厂补充上面工厂模式的用过。
目的:生成一个实例用到的算法非常复杂,但是组合在一起的操作比较简单。于是有了builder
操作:
接口a
实现接口a的类B与类C
实现接口a的抽象类D(内置一个B实例)与类E(C实例)
创建扩展了类D和类E的 1 2 3 4.
生成list类 包含上面的1 2 3 4.
生成一个listbuilder类。用来构造生成1 2 3 4组成不同的套餐
这个操作看起来比较逗比:
怎么用?结合通知栏builder来看。通知栏包含各种东西,按钮,消息,图标,大小等等。这些都是一个个上面的1 2 3 4.
所以你生成一个通知用到了builder就是生成不同的1 2 3 4组合。对话框也有builder来新建一个builder
上午先看到这里:知道这个有用吗?有!会调用,你有什么用,随便找个会百度的都行。知道原理有用吗?我也不知道毕竟我只是一个破大学生
知识需要消化,虽然不嫌多。下午继续学习。