设计模式是什么?我能想到的是「套路」,或者说是「最佳实践」。要写出「好代码」,我们需要遵循一些「最佳实践」,就好像我们要培养优秀的个人品行,需要遵循一些「美德」。
以下是美国国父富兰克林给自己列的「美德」清单:
1. 节制:食不可饱,衣不过量。
2. 慎言:只讲对人对己有益之言,不说无聊琐碎之话。
3. 条理:让拥有的每件东西都各有其位,让要做的每件事都各有其时。
4. 坚毅:一旦决定做一件事,就马上义无反顾的去做。
5. 节俭:将钱用在于人于己有益的事情上,杜绝浪费。
6. 勤奋:不耽误任何时间,总是在干有用的事情,终止不必要的行为。
7. 真诚:不采用任何有害的欺骗行为,想问题和说话都要公平公正。
8. 正直:绝不做损人利己之事。
9. 适度:避免极端,避免别人对你产生怨恨。
10. 清洁:决不允许身体、衣服和居所不洁。
11. 心静:不被琐碎之事,寻常之事,和不可避免之事萦绕。
12. 贞洁:不过度行房事,也不因男女关系损害和他人的关系。
13. 谦卑:以耶稣和苏格拉底为楷模。
为什么列这么多美德?富兰克林的逻辑是把美德分的细一些,每个美德只包含一个简单、清晰的外延,这样就更容易做到了。
这么多美德记都记不过来,怎样才能做到?富兰克林的方案是一周只注重培养其中一个美德,这样13周就是一个周期,一年可以循环4次。
以上的13条美德和2条富兰克林的实践,就是富兰克林培养优秀个人品行的「设计模式」吧?
回到设计模式,设计模式中也有一些「美德」,我们简称它们为六大设计原则。
设计模式的六大原则
单一职责原则 Single Responsibility Principle
定义:一个类应该只有一个发生变化的原因。
There should never be more than one reason for a class to change.
开闭原则 Open Closed Principle
定义:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.
里氏替换原则 Liskov Substitution Principle
定义:如果对每一个类型为S的对象o1,都有类型为T的对象o2,使得以T定义的所有程序P在所在的对象o1都代换为o2时,程序P的行为没有发生变化,那么类型S是类型T的子类型。
If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T,the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.
迪米特法则 Law of Demeter
定义:一个对象应该对其他对象有最少的了解。
Only talk to your immediate friends.
接口隔离原则 Interface Segregation Principle
定义:客户端不应该依赖它不需要的接口。
Clients should not be forced to depend upon interfaces that they don’t use.
依赖倒置原则 Dependence Inversion Principle
定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
High level modules should not depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details.Details should depend upon abstractions.
设计模式的分类
- 创建型模式
- 简单工厂模式 Simple Factory Pattern
- 工厂方法模式 Factory Method Pattern
- 抽象工厂模式 Abstract Factory
- 建造者模式
- 单例模式
- 结构型模式
- 设配器模式
- 桥接模式
- 装饰模式
- 外观模式
- 享元模式
- 代理模式
- 行为型模式
- 命令模式
- 中介者模式
- 观察者模式
- 状态模式
- 策略模式
实际使用场景
Spring核心容器的主要组件是BeanFactory,它是工厂模式的实现。
参考链接
http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/simple_factory.html