创建型设计模式:这些模式关注对象的创建并隐藏创建逻辑
1、工厂方法模式(Factory Method):在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型(有父子关系然后实例化不同的子类对象) ??根据参数调用不同的子类实现是不是工厂方法 2、抽象工厂模式(Abstract Factory):在工厂模式基础上包装一个类,在类中去实例化不同的工厂对象。(其会返回一个工厂对象。 接下来, 工厂将被用于创建特定的子组件。) 3、单例模式(Singleton):保证一个类只有一个实例, 并提供一个访问该实例的全局节点(构造方法为私有) 4、构建者模式(Builder):使你能够分步骤创建复杂对象。拥有一个构建方法和多个配置结果对象的方法,生成器方法通常支持方法链。(使建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了) 5、原型模式(Prototype):用于创建重复的对象,同时又能保证性能。复制已有对象,而又无需使代码依赖它们所属的类。(java中实现了Cloneable接口的类都可以克隆)
行为型设计模式:这些模式关注对象之间的通信以及责任分配。
1、责任链模式(Chain of Responsibility):将请求沿着处理者链进行传递。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。
2、中介者模式(Mediator):该模式限制对象之间的直接交互,迫使它们通过一个中介者对象进行合作。(如果一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。)
3、状态模式(State):类的行为是基于它的状态改变的。创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象(switch语句的大型状态机转换为对象)
4、访问者模式(Visitor):将算法与其所作用的对象隔离开来。允许你在不修改已有代码的情况下向已有类层次结构中增加新的行为。
5、命令模式(Command):将请求或简单操作转换为一个对象。把请求一个操作的对象与知道怎么执行一个操作的对象分隔开(服务员记录点餐命令,传递给厨师执行)
6、备忘录模式(Memento):备忘录的基本原则可通过序列化来实现,这在 Java 语言中很常见。尽管备忘录不是生成对象状态快照的唯一或最有效方法,但它能在保护原始对象的结构不暴露给其他对象的情况下保存对象状态的备份。
7、策略模式(Strategy):定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。
8、迭代器模式(Iterator):用于顺序访问集合对象的元素,分离了集合对象的遍历行为,抽象出一个迭代器类来负责(iterator)
9、观察者模式(Observer):当对象间存在一对多关系时,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。(订阅机制)
10、模板方法模式(Template Method):它在超类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。
11、解释器模式(Interpreter)
12、空对象模式(Null Object)
结构型设计模式:这些模式关注类和对象的组合
1、适配器模式(Adapter):将一个类的接口转换成所希望的另外一个接口,使接口不兼容的对象能够相互合作。(适配器可以通过以不同抽象或接口类型实例为参数的构造函数来识别。当适配器的任何方法被调用时,它会将参数转换为合适的格式,然后将调用定向到其封装对象中的一个或多个方法。)
2、过滤器模式(Filter):使用不同的标准来过滤一组对象(一个接口,每个子类实现过滤接口,过滤之后再返回过滤结果)
3、装饰者模式(Decorator):创建了一个装饰类,用来包装原有的类,提供了额外的功能。(以自身类型的对象作为参数的函数)
4、代理模式(Proxy):一个类代表另一个类的功能,代理控制着对于原对象的访问, 并允许在将请求提交给对象前后进行一些处理。(java中的Proxy代理类)
5、桥接模式(Bridge):可将业务逻辑或一个大类拆分为不同的层次结构, 从而能独立地进行开发。(红色圆圈和绿色圆圈可拆分为形状和颜色两个大类)
6、组合模式(Composite):使用它将对象组合成树状结构,并且能像使用独立对象一样使用它们。组合最主要的功能是在整个树状结构上递归调用方法并对结果进行汇总。(树枝和叶子实现统一接口,树枝内部组合该接口,让客户可以一致地使用组合结构和单个对象)
7、外观模式(Facade):为子系统中的一组接口提供一个一致的界面,定义了一个高层接口来隐藏系统的复杂性,这个接口使得这一子系统更加容易使用。
8、享元模式(Flyweight):享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。(可以通过构建方法来识别, 它会返回缓存对象而不是创建新的对象)