工厂方法设计模式:将产品的一些特性规范化成接口,让不同的产品对象能够遵守这一规范,然后再通过不同的参数创建不同的产品对象。优点是我们无需关心生产的产品具体是什么对象,不同产品之间没有耦合性,缺点是随着产品种类的提升类也会随之变多,每次新增产品种类都需要修改生产产品对象的方法。
抽象工厂设计模式:这种设计模式的出现是为了解决工厂方法的一个弊端,就是每次新增种类都需要修改生产产品的方法,在抽象工厂中,生产对象已经不是由方法来做,而是将生产线抽象化成接口,让不同的产品种类有不同的生产线。这种设计模式虽然解决了工厂方法的一个弊端(修改方法),同时也加重了工厂方法的另一个弊端(类变多)。
工厂设计模式(工厂方法/抽象工厂)和策略设计模式有什么区别
这两种设计模式虽然十分相似,但是最大的不同在于,工厂设计模式需要关心产品如何生产,而策略设计模式不需要。因为工厂设计模式面向的是产品,而策略设计模式面向的是配置。
责任链设计模式:继承让类与类之间有了关系,而责任链设计模式就是让不同方法之间有了关系,更准确的说相互建立了责任关系。比如 View 的事件分发机制,我们知道 View 事件分发有三种:分发、拦截、消费,当事件被停止分发时,ViewGroup 会将事件交给自己处理(拦截 ——> 消费),否则就交给子 View 继续分发,如果没有子 View 了就会交给自己处理(消费)。
策略模式:通过定义统一的规范,让继承者或者实现者能够完成不同的需求,优点是能够统一管理需求,从而减少代码的修改,缺点是类会随着需求变多而变多。例如 RecyclerView 分割线定义就是采用了这种设计模式,我们可以通过继承 ItemDecoration 类来完成对 RecyclerView 分割线的定制化。
代理设计模式:通过实现原对象提供的接口规范,然后对原对象的接口方法进行调用,从而管控这个对象的访问。这设计模式还分为两种,一种是静态代理,另一种是动态代理。静态代理比较简单,通过实现接口进行对象代理,缺点是随着代理的对象越多类也会随之变多,而动态代理恰恰解决了这一问题,通过 Proxy(委托人或者代理人)类,可以实现对接口调用的动态监听。
装饰设计模式:在不破坏继承关系的前提下对原有对象进行扩展。例如 ListView 的 addHeader 和 addFooter 就是采用了这种设计模式,通过对 BaseAdapter 的再次实现,将原适配器对象和添加头尾功能进行封装。最终再通过 ListView.setAdapter 将原适配器对象替换掉,这样就能在不用改变原有适配器对象的前提下对适配器的功能进行扩展。
代理设计模式和装饰设计模式有什么区别
这两种的方式实现的方式基本雷同,但是本质的思想不一样,代理设计模式是为了限制外界对对象的访问,而装饰设计模式是为了对象的功能更进一步扩展。
模板设计模式:将对象的一些共同属性和方法封装到一个抽象类中,子类也可以通过重写来改变原有的逻辑,这种设计模式的最明显的特点是能够提升代码的复用性。例如 BaseActivity、BaseFragment 等就是将一些常用的属性和方法抽取出来,供子类调用或者重写。
享元设计模式:对一些频繁创建回收的对象进行内存管理,避免这种情况下导致的内存抖动。这种设计模式最明显的特点是复用对象。例如 Handler 源码中使用 Message 的对象都是通过 Message.obtain (静态方法)来获得,它会优先从对象池中复用没有正在使用的 Message 对象,而当 Message 对象使用完毕之后 MessageQueue (消息队列)会调用 Message.recycle (对象方法)方法将其回收到对象池中。
模板设计模式和享元设计模式有什么区别
这两种设计模式最大的共同点就是复用,只不过模板设计模式针对的是代码的复用,而享元设计模式针对的是对象的复用。