简单工厂模式:提供参数,根据形参返回具体子类的实例,而返回类型是父类,这个过程利用了多态。
策略模式:构造器形参是父类,而传入的是子类,父类调用方法A等价于调用子类的方法A。
开放-封闭原则:对类的实现,以后可以通过继承更多子类进行扩展,但是不应在原来的类上做修改。
单一职责原则:每个类职责鲜明,不应有超出其本应有的功能。
依赖倒转原则:高层模块不应依赖底层模块,高层模块应依赖抽象或接口,而底层模块由抽象或接口继承实现。
装饰模式:每个装饰子类只关心自己的功能完善,至于加入装饰链条的操作,交给某个类方法比如setComponent同意完成。
代理模式:在代理内部有代理对象类的实例,代理类的方法的实现的实质就是调用代理对象实例的相应方法。其作用是为其他对象提供代理,以提供对该对象的访问控制,如在访问前做一些内务处理(智能代理);也可以为一个存在于不同地址空间的对象提供局部代表(远程代理);也可以用于存放实例化耗时很长的类(虚拟代理);控制访问权限(安全代理)。
工厂方法模式:每一个子类都对应一个工厂子类,一个工厂子类可以生产一个对象子类实例。
原型模式:通过克隆方式从已有实例中克隆出新实例,并对新实例中的部分属性做修改。
模板方法模式:子类继承父类,并重写父类方法。即把父类当模板。
迪米特法则:尽量降低成员访问权限,使类之间松耦合,相互调用尽量通过第三方,如接口抽象类。
外观模式:在一个大型遗留系统外围套一个接口层,以供外界调用。
建造者模式:建造类的建造方法接收原材料对象,按钦定的程序在内部走一遍流程,使用者可以再调用建造类的getResult()查看方法。
观察者模式:监听者和被监听对象相互耦合,被监听者发生变化就通知监听者,监听者就去获取被监听者中的更新信息。
单例模式:类的构造方法为private,getInstance()判断实例全局变量为空,则创建一个实例。多线程时利用双重检查锁if(isNull?) synchronized{ if(isNull?) {……}}——但其实这是不安全的,由于重排序,jvm中Instance类可能会被先new出一个空的实例对象,当另一个线程发现了这个实例对象,会误以为已经创建成功了,于是率先返回了这个错误的实例。解决方法:
1) 可用volatile修饰Instance;
2)可对整个getInstance()方法使用synchronized(使return语句也在同步范围内),但这样效率低下。
3)class Resource{
private static class ResourceHolder{
public static Object resouce = new Object();
}
public static Object getResource(){
return ResourceHolder.resouce;
}
}
---------------------
由于static的特性,可以保证延迟初始化(使用该类时才会被加载进来)和线程安全。
抽象工厂模式:工厂返回的实例是抽象类,即一个抽象工厂衍生出很多子工厂,根据所给形参(类似于简单工厂)(形参可以是String,可用于反射)返回不一样的子工厂(利用了多态)。
状态模式:是一个有限状态机,Work类和State的子类双向耦合。work类先设有初始状态和一个变量值,根据变量值向状态类提出变化请求,状态类根据变量值做出条件判断,条件不符合则修改work类中的状态,并且再次向work类发出状态变化的请求,直到达到条件符合的稳态。
适配器模式:当系统与外界的接口不符合时,使用适配器,如为了适应第三方组件。
备忘录模式:比较简单,就是把Origin类的state属性保存到Memo类的state属性中,有必要时则读取。不过Memo类的创建和读取只能交给CareTaker类来进行。
组合模式:Component的两种子类:叶子结点和非叶结点。非叶结点可以add、remove子结点,叶子结点不能add、remove。于是每个非叶结点都可以组合无穷多子节点。这种模式使客户可以一致地使用组合结构和单个对象。
迭代器模式:
桥接者模式:聚合/合成原则(尽量使用合成、聚合,不使用继承)。手机可按品牌分类,也可按软件分类。不妨在品牌子类中增加软件子类属性,这样可以把品牌和软件两种类聚合起来。
命令模式:将请求操作对象化,客户的所有请求计入队列,可随时增删,之后统一执行。
职责链模式:h1类中h2类的实例属性,h2中有h3的实例属性,当执行h1的handle()方法,若h1无法处理,就交给h2,h2不行就交给h3。类似于简化版的状态模式。
中介者模式:两个类信息交流,却不直接发生作用,而是分别与中介发生双向耦合(类似观察者模式)。c1向中介发送String和this,中介就会去提醒c2;c2向中介也发送String和this,中介就会去提醒c1。即中介中含有c1和c2的实例,c1、c2中仅含有中介的实例。例如计算器程序,其上的各个计算组件只与计算器form发生交互。
享元模式:类似于单例模式,工厂类只创了一个单例实例存进Map中,对于同一个key返回同一个实例。
解释器模式:没什么特别的,只是把字串遍历,使用switch进行分类,然后解释出含义。
访问者模式:向一个Structure中固定数量的元素(已确定的),该Structure每接待一个访问者,就会令所有元素挨个调用accept(访问者)来处理,访问者在accept()方法中,调用自己的发方法visitor.handle(this)来处理这个元素。(这里用到了两次分派,第一分派是元素处理访问者,第二次分派,访问者用自己的方法处理元素)。这个模式中,元素是固定数据结构,访问者(作为新算法)可以任意继承增加。