代码重构 - 设计模式总结
单例模式
单例模式
Singleton 保证一个类产生一个实例。带来好处:
l 单一实例,减少实例频繁创建和销毁带来的资源销毁。
l 多个用户使用该实例,便于统一控制。
饿汉单例实例特点:
l 构造函数私有;
l 通过私有静态成员变量创建;
l 通过公有静态方法返回该实例对象;
懒汉单例实例特点(性能稍差,推荐饿汉单例模式):
l 构造函数私有;
l 通过私有静态成员变量创建,但为 null;
l 通过公有静态方法返回该实例对象,如果实例=null,创建并返回(该方法注意加锁);
适配器模式
适配器模式应用场景:1.系统需要使用现有的类,而此类的接口不符合系统的需要。2. 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。3. 通过接口转换,将一个类插入另一个类系中。
优点:1. 可以让任何两个没有关联的类一起运行。2. 提高类的复用。
缺点:过多使用,导致明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现。2.由于 java 只能继承一个类,最多只能适配一个适配者类,而目标类必须是抽象类。
l 类适配器
l 对象适配器
Junit 中设计模式
模板方法模式
扩展功能的基本模式之一,是一种类的行为模式。
其通过继承的方法来实现扩展;1.基类负责算法的轮廓和骨架;2.子类负责算法的具体实现;、
具体模板方法形式:
抽象方法:
l protected abstract void step();
l 强制子类实现该步骤;
具体方法:
l protected void doingsomething(){…}
l 子类不需要覆盖,但也可以覆盖
l 如果明确不要子类覆盖,最好标明:final
钩子方法:
l protected void setup(){}
l 空的实现(缺省适配器模式)
l 子类选择性覆盖,以便在特定时机做些事
模板方法实现举例:
servlet 模板方法如下图
策略模式
策略模式是扩展功能的另一种基本模式,它是一种对象的行为模式。
通过组合方法来实现扩展。例如:Junit 包中 testCase 就是策略模式的应用。
何时使用策略模式
1. 系统需要在多种算法中选择一种;
2. 重构系统时,将条件语句转换成对于策略的多态性调用;
策略模式优点(对比模板模式)
l 调用策略方与策略的具体实现分离
l 策略对象可以自由组合
策略模式缺点
策略模式仅仅封装了算法的具体实现,方便添加和替换算法。但它并不关心何时使用算法,这个必须由客户端决定。
组合模式
组合模式是一种对象的结构模式,用于把一组相似的对象当做一个单一的对象,用来表示部分及整体的关系。
使用场景:描述部分及整体层次结构,例如:树形结构;忽略单个对象和组合对象之间区别,统一使用组合对象中的所有对象。
优点:1.高层调用低层。2.节点自由增肌。
缺点:使用组合模式时,部分和整体的声明都是实现类,非接口,违反依赖倒置。
装饰器模式
装饰器模式是一种对象的结构模式
装饰器作用
不改变客户端接口前提下,扩展现有对象功能(对客户端透明)
Spring 中设计模式
单例模式
Spring 中单例模式是容器式的单例
Spring MVC 模式
MVC 模式用于应用程序分层开发。
Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
View(视图) - 视图代表模型包含的数据的可视化。
Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
版权声明: 本文为 InfoQ 作者【Mars】的原创文章。
原文链接:【http://xie.infoq.cn/article/93008a2ef576c943b9c9da726】。文章转载请联系作者。
评论