简单工厂模式
就是从很多类中根据条件,通过方法,产生相应类的实例。
策略模式
它定义了算法家族,分别封装起来,让它们之间可以互相转换,此模式让算法的变换不会影响到使用算法的客户。
单一职责原则
就一个类而言,应该仅有一个引起它变化的原因。
一个类承担的职责过多,就会耦合职责,遇到变化就会导致设计可能遭受破坏。
软件设计正真要做的内容,就是发现职责并且把那些职责相互分离开来。
如何判断要分离出类来?
多余一个动机去改变一个类,那么这个类就具有多余一个的职责,就应该考虑类的分离。
开放封闭原则
一开始就设计一个功能完全的类,然后对新需求添加。(这是最完美的状态)
但是完全的“封闭”是不可能的,所以猜测最有可能变化的种类,然后隔离哪些变化。
里时代换原则
子类型必须能够替换父类型,并且程序的行为没有变化。
依赖倒置原则
高层模块不依赖底层模块,高层模块和底层模块都依赖抽象。
抽象应该依赖细节,细节应该依赖抽象。
装饰者模式
动态的给一个对象添加一些额外的职责。
装饰者对象与被装饰对象要有共同的抽象类。或者装饰者对象的父类就是被装饰对象,这样才能类似链式的调用返回的对象。
代理者模式
为其他对象提供一种代理,以控制对这个对象的访问。
代理对象的行为和被代理对象基本一致,被代理对象可能“透明”。
代理模式就是添加间接性,通过“间接性”添加更多的行为。
工厂方法模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
“工厂方法模式”Vs“简单工厂模式”
简单工厂模式对修改和添加都开放。
工厂方法模式对修改关闭对添加开放。
原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型模型其实就是从一个对象在创建另一个可定制的对象,而且不需要知道任何创建细节。
模板方法模式
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法可以使子类不改变算法结构即可重定义该算法的某些特定步骤。
通过把不变行为的代码搬移到超类,去除子类中的重复代码来体现它的优势。
迪米特法则 最少知识原则
如果两个类不必彼此直接通信,那么这两个类就不应当直接的相互作用。如果其中一个类需要调用另一个类的某个方法的话,可以直接通过第三者转发这个调用。
根本思想是强调了类之间的松耦合。
外观模式
为子系统中的一组借口提供一致的界面,此模式定义了一个高层借口,这个接口使得这一子系统更加容易使用。
体现了迪米特法则和依赖倒置
和代理模式很像但是代理模式代理一个实例,外观模式提供一组借口。
使用 层与层 新系统与老系统
建造者模式
将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。
创建对象的算法太复杂,需要独立出去。
观察者模式
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主体对象。这个主题对象在转态发生改变的时候,就会通知所有观察者对象,使他们能够自我更新。
抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无需具体制定它们具体的类。
跟工厂方法模式相比就是多了“一系列”,不单是创建一个。
反射
在你不知道一个对象内部结构的情况下(你甚至连这个对象的一个属性,或api都不知道),怎么跟他通信呢?这个时候就要通过一种机制,得到它的内部结构。这种机制就叫做反射。说白了,窥探对象内部结构的方法就叫做反射。
配置文件也很重要
状态模式
当一个对象内在状态改变时,允许改变内在的行为,就像是改变了对象的类。
主要是简化if判断语句。
适配器模式
将行为相同,接口不同的类,通过适配器转换为相同接口。
主要是对已有代码的重复利用。
备忘录模式
在不破坏封装的情况下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存状态。
组合模式
将对象组合成树形结构以表示"整体-部分"的层次结构。单个对象和组合对象的使用具有一致性,就像透明的。
透明模式和安全模式区别
前者不要区别对待单个对象与组合对象后者要。
迭代器模式
提供一种方法,顺序访问聚合对象内元素的顺序,但又不暴露该对象的内部表示。
单例模式
保证一个类只被实例化一次,并且提供一个全局化获取入口。
饿汉式和懒汉式加载方式
多线程下的单例
双重锁定
桥接模式
将一个类中抽象部分与实例部分分离。
桥接模式就是合成/聚合模式原则得使用范例。
a是b的一部分并且不可分离就是合成
a是b的一部分并且可以分离就是聚合
命令模式
将请求封装成为一个对象,从而使客户端可以参数化请求对象。命令模式可以用来记录日志,对请求排列,撤销以及重做。
职责链模式
使多个对象都能处理请求,请求的发送者与接受者减少耦合,请求就像一条链一样在接受对象之间传递,直到能处理的对象。
中介者模式
使用中介对象将一系列对象的交互封装,减少对象之间的耦合,而且可以独立的改变它们之间的交互。
享元模式
说得直白就是共享实例,节约内存。
创建的对象多或者占据内存量大的时候就可以使用享元模式。
解释器模式
给定一个语言,定义它的文法的一种表示并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
对于一些频率比较高的问题,定义成为一段语句,使用解释器来解决这些问题。(解释器复杂化就是解释一门语言)
当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可以使用解释器模式。
访问者模式
表示一个作用于某对象结构中的各个元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
访问者模式的目的是要把处理从数据结构分离出来。有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。
缺点增加新的数据结构变得困难。