设计模式
23 种经典的设计模式。它们又可以分为三大类:创建型、结构型、行为型。
- 创建型 常用的有:单例模式、工厂模式(工厂方法和抽象工厂)、建造者模式。 不常用的有:原型模式。
- 结构型 常用的有:代理模式、桥接模式、装饰者模式、适配器模式。 不常用的有:门面模式(外观模式)、组合模式、享元模式。
- 行为型 常用的有:观察者模式、模板模式、策略模式、职责链模式、迭代器模式、状态模式。 不常用的有:访问者模式、备忘录模式、命令模式、解释器模式、中介模式。
单例:
单例的定义:“一个类只允许创建唯一一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。”单例模式创建的对象是进程唯一的。
我们编写的代码,通过编译、链接,组织在一起,就构成了一个操作系统可以执行的文件,也就是我们平时所说的“可执行文件”(比如 Windows 下的 exe 文件)。可执行文件实际上就是代码被翻译成操作系统可理解的一组指令,你完全可以简单地理解为就是代码本身。 当我们使用命令行或者双击运行这个可执行文件的时候,操作系统会启动一个进程,将这个执行文件从磁盘加载到自己的进程地址空间(可以理解操作系统为进程分配的内存存储区,用来存储代码和数据)。接着,进程就一条一条地执行可执行文件中包含的代码。比如,当进程读到代码中的 User user = new User(); 这条语句的时候,它就在自己的地址空间中创建一个 user 临时变量和一个 User 对象。 进程之间是不共享地址空间的,如果我们在一个进程中创建另外一个进程(比如,代码中有一个 fork() 语句,进程执行到这条语句的时候会创建一个新的进程),操作系统会给新进程分配新的地址空间,并且将老进程地址空间的所有内容,重新拷贝一份到新进程的地址空间中,这些内容包括代码、数据(比如 user 临时变量、User 对象)。 所以,单例类在老进程中存在且只能存在一个对象,在新进程中也会存在且只能存在一个对象。而且,这两个对象并不是同一个对象,这也就说,单例类中对象的唯一性的作用范围是进程内的,在进程间是不唯一的。
单例模式:https://blog.csdn.net/u013750244/article/details/134743225
https://blog.csdn.net/u013750244/article/details/108050839
工厂模式:https://mp.weixin.qq.com/s/T3h6479P5kMVtKfXiLcc-Q
简单工厂模式:
简单工厂模式有唯一的工厂类,工厂类的创建方法根据传入的参数做if-else条件判断,决定最终创建什么样的产品对象。
工厂方法模式:
工厂方法模式由多个工厂类实现工厂接口,利用多态来创建不同的产品对象,从而避免了冗长的if-else条件判断。
抽象工厂模式:
抽象工厂模式把产品子类进行分组,同组中的不同产品由同一个工厂子类的不同方法负责创建,从而减少了工厂子类的数量。
外观模式:
模板方法模式 :Activity就是用于管理窗口的 “任务和返回栈机制” 在背地里运筹帷幄,那么未来开发者继承该 “窗口原型”,即可得到一个简练的 “配置模板”,不仅需要一个窗口,还想要多窗口。谈到多窗口,便涉及 “窗口切换、通信” 等等,甚是麻烦,这 “脏活累活” 要是交给未来开发者干,App 又该如何快速开发 —— 毕竟,开发者良莠不齐,API 越是复杂,就越易用错和产生不可预期问题。
组合模式:组合模式 封装 View/ViewGroup。凭借组合模式,ViewGroup 能轻易在自身内部嵌套更多 View 或 ViewGroup,从结构来看,就像套娃。
享元模式:Message的创建就是享元模式,从消息池取出一个消息,Message.obtain,放到需要用到的链表,没有了创建和销毁的过程,避免内存抖动。MessageQueue.quit中remove消息的时候调用recycleUnchecked()方法,并不是真的将消息干掉,而是将消息里的内容都去掉。message是有一个内存块,里面的内容处理掉之后,放到另一个消息链表,头插,每生成一个节点放到头部。
监听者模式:
适配器模式:Recycleview
装饰模式
ContextImpl是抽象类Context的具体实现,ContextWrapper及所有其子类对象持有的Context均是ContextImpl对象。所以对于 Application,Activity 和 Service 等类来说,他们只是一个个装饰者,都是用来装饰 ContextImpl 这个被装饰者类。
原型模式:比如我们需要一张Bitmap的几种不同格式:ARGB_8888、RGB_565、ARGB_4444、ALAPHA_8等。那我们就可以先创建一个ARGB_8888的Bitmap作为原型,在它的基础上,通过调用Bitmap.copy(Config)来创建出其它几种格式的Bitmap。
外观模式:ARouter实际是使用了外观模式,其所有方法都是调用了_ARouter的同名方法。
ARouter的build(string)方法:
public Postcard build(String path) {
return _ARouter.getInstance().build(path);
}
中介模式与外观模式(门面模式)区别?
中介模式:A类与B类相互调用关系,通过中介模式解耦。
外观模式(门面模式):对其它类提供统一接口服务。 客户端调用一个接口,门面模式调用众多类。
总结:
中介模式强调类与类间解耦
外观模式(门面模式):对外提供一个接口。
https://blog.csdn.net/zxc123e/article/details/55213252