设计模式原则
设计原则 | 一句话归纳 | 目的 |
开闭原则(OCP) (Open-Close) | 对扩展开放,对修改关闭 | 减少维护带来新的风险 |
依赖倒置原则(DIP) (Dependence Inversion) | 高层不应该依赖底层 | 更利于代码结构的升级 扩展 |
单一职责原则(SRP) (Simple Responsibility) | 一个类只干一件事 | 便于理解,提高代码可读性 |
接口隔离原则(ISP) (Interface Segregation) | 一个接口只干一件事 | 功能解耦,高聚合,低耦合 |
迪米特法则(LoD) (Law of Demeter) | 不该知道的不要知道 | 只和朋友交流,不和陌生人说话,减少代码臃肿 |
里氏原则(LSP) (Liskov Substitution) | 子类重写方法功能发生改变, 不应该影响父类方法的含义 | 防止继承泛滥 |
合成复用原则(CARP) (Composite/Aggregate Reuse) | 尽量使用组合实现代码复用,而不使用继承 | 降低代码耦合 |
GOF 23种设计模式
分类 | 设计模式 |
创建型 | 工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、单例模式(Singleton)、原型模式(Prototype)、建造者模式(Builder) |
结构型 | 代理模式(Proxy)、门面模式(Facade)、装饰者模式(Decorator)、享元模式(Flyweight)、组合模式(Composite)、适配器模式(Adaoter)、桥接模式(Bridge) |
行为型 | 模板方法模式(Template Method)、策略模式(Strategy)、责任链模式(Chain of Responsibility)、迭代器模式(Iterator)、命令模式(Command)、状态模式(state)、备忘录模式(Memento)、中介者模式(Mediator)、解释器模式(Interpreter)、观察者模式(Observer)、访问者模式(Visitor) |
各设计模式总结
设计模式 | 目的 | 框架源码 |
工厂方法模式(Factory Method) | 封装创建细节 | LoggerFactory、Calender |
单例模式(Singleton) | 保证独一无二 | BeanFactory、Runtime |
原型模式(Prototype) | 高效创建对象 | ArrayList、PrototypeBean |
建造者模式(Builder) | 开放个性配置步骤 | StringBuilder、BeanDefinitionBuilder |
代理模式(Proxy) | 增强职责 | ProxyFactoryBean、JdkDynamicAopProxy、CglibAopProxy |
门面模式(Facade) | 统一访问入口 | JdbcUtils、RequestFacade |
装饰者模式(Decorator) | 灵活扩展,同宗同源 | BufferedReader、InputStream |
享元模式(Flyweight) | 共享资源池 | String、Integer、ObjectPool |
组合模式(Composite) | 统一整体和个体 | HashMap、SqlNode |
适配器模式(Adaoter) | 兼容转换 | AdvisorAdapter、HandlerAdapter |
桥接模式(Bridge) | 不允许继承 | DriverManager |
委派模式(Delegate) | 只对结果负责 | ClassLoader、BeanDefinitionParserDelegate |
模板方法模式(Template Method) | 逻辑复用 | JdbcTemplate、HttpServlet |
策略模式(Strategy) | 把选择权交给用户 | Comparator、InstantiationStrategy |
责任链模式(Chain of Responsibility) | 解耦处理逻辑 | FilterChain、Pipeline |
迭代器模式(Iterator) | 统一对集合的访问方式 | Iterator |
命令模式(Command) | 解耦请求和处理 | Runnable、TestCase |
状态模式(state) | 绑定状态和行为 | Lifecycle |
备忘录模式(Memento) | 备份 | StateManageableMessageContext |
中介者模式(Mediator) | 统一管理网状资源 | Timer |
解释器模式(Interpreter) | 实现特定语法解析 | Pattern、ExpressionParser |
观察者模式(Observer) | 解耦观察者与被观察者 | ContextLoaderListener |
访问者模式(Visitor) | 解耦数据结构和数据操作 | FileVisitor、BeanDefinitionVisitor |
设计模式之间的关联关系和对比
- 单例模式和工厂模式
实际业务代码中,通常会把工厂类设计为单例。
- 策略模式和工厂模式
工厂模式包含工厂方法模式和抽象工厂模式是创建型模式,策略模式属于行为型模式。
工厂模式主要目的是封装好创建逻辑,策略模式接收工厂创建好的对象,从而实现不同的行为。
- 策暗模式和委派模式
策略模式是委派模式内部的一种实现形式,策略模式关注的结果是否能相互替代。
委派模式更关注分发和调度的过程。
- 模板方法模式和工厂方法模式
工厂方法是模板方法的一种特殊实现。
- 模板方法模式和策暗模式
模板方法和策略模式都有封装算法。
策略模式是使不同算法可以相互替换,且不影响客户端应用层的使用。
模板方法是针对定义一个算法的流程,将一些有细微差异的部分交给子类实现。
模板方法模式不能改变算法流程,策略模式可以改变算法流程且可替换。策略模式通常用来代替if. else..等条件分支语句。
- 装饰者模式和静态代理模式
装饰者模式关注点在于给对象动态添力口方法,而代理更加注重控制对对象的访问。
代理模式通常会在代理类中创建被代理对象的实例,而装饰者模式通常把被装饰者作为构造参数。
- 装饰者模式和适配器模式
装饰者模式和适配器模式都是属于包装器模式(Wrapper Pattern)。
装饰者模式可以实现被装饰者与相同的接口或者继承被装饰者作为它的子类,而适配器和被适配者
可以实现不同的接口。
- 适配器模式和静态代理模式
适配器可以结合静态代理来实现,保存被适配对象的引用,但不是唯一的实现方式。
- 适配器模式和策暗模式
在适配业务复杂的情况下,利用策略模式优化动态适配逻辑。