开闭原则的意思是:对扩展开放,对修改关闭。在程序须要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,咱们须要使用接口和抽象类,后面的具体设计中咱们会提到这点。java
里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类能够出现的地方,子类必定能够出现。LSP 是继承复用的基石,只有当派生类能够替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也可以在基类的基础上增长新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,因此里氏代换原则是对实现抽象化的具体步骤的规范。算法
这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。数据库
这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另一个意思是:下降类之间的耦合度。因而可知,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调下降依赖,下降耦合。编程
最少知道原则是指:一个实体应当尽可能少地与其余实体之间发生相互做用,使得系统功能模块相对独立。设计模式
合成复用原则是指:尽可能使用合成/聚合的方式,而不是使用继承。缓存
这些设计模式提供了一种在建立对象的同时隐藏建立逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例须要建立哪些对象时更加灵活。多线程
工厂模式(Factory Pattern)是 Java 中最经常使用的设计模式之一。这种类型的设计模式属于建立型模式,它提供了一种建立对象的最佳方式。架构
在工厂模式中,咱们在建立对象时不会对客户端暴露建立逻辑,而且是经过使用一个共同的接口来指向新建立的对象。并发
public interface Shape {} public class Circle implements Shape {} public class Square implements Shape {} public class ShapeFactory { public Shape getShape1() { return new Circle(); } public Shape getShape2() { return new Square(); } public Shape getShape(String shape) { switch (shape) { case "circle": return new Circle(); case "square": return new Square(); } return null; } }
工厂方法(Factory Method)模式的意义是定义一个建立产品对象的工厂接口,将实际建立工做推迟到子类当中。核心工厂类再也不负责产品的建立,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可使系统在不修改具体工厂角色的状况下引进新的产品。高并发
工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题。首先彻底实现‘开-闭 原则’,实现了可扩展。其次更复杂的层次结构,能够应用于产品结果复杂的场合。
public interface Shape {} public class Circle implements Shape {} public class Square implements Shape {} public interface ShapeAbstractFactory { Shape getShape(); } public class CircleFactory implements ShapeAbstractFactory { public Shape getShape() { return new Circle(); } } public class SquareFactory implements ShapeAbstractFactory { public Shape getShape() { return new Square(); } }
抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的建立型模式,用于产品族的构建。抽象工厂是全部形态的工厂模式中最为抽象和最具通常性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式能够向客户端提供一个接口,使客户端在没必要指定产品的具体状况下,建立多个产品族中的产品对象。
工厂模式中的每个形态都是针对必定问题的解决方案,工厂方法针对的是一类产品;而抽象工厂模式针对的是多类产品,一类产品内又有多种实现类型的状况。
public interface Shape {} public class Circle implements Shape {} public class Square implements Shape {} public interface color {} public class Red implements Color {} public class Blue implements Color {} public interface AbstractFactory { Shape getShape(); Red getColor(); } public class Factory1 implements AbstractFactory { ... } public class Factory2 implements AbstractFactory { ... }
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于建立型模式,它提供了一种建立对象的最佳方式。
这种模式涉及到一个单一的类,该类负责建立本身的对象,同时确保只有单个对象被建立。这个类提供了一种访问其惟一的对象的方式,能够直接访问,不须要实例化该类的对象。
注意:单例类只能有一个实例。
public class Singleton { private volatile static Singleton singleton; private Singleton (){} // 不容许经过new来实例化对象 public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于建立型模式,它提供了一种建立对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其余对象的。
public interface Porudct { } public interface Builder { Product buildPart(Product p); } public interface Director { Product getProduct(); }
原型模式(Prototype Pattern)是用于建立重复的对象,同时又能保证性能。这种类型的设计模式属于建立型模式,它提供了一种建立对象的最佳方式。
这种模式是实现了一个原型接口,该接口用于建立当前对象的克隆。当直接建立对象的代价比较大时,则采用这种模式。例如,一个对象须要在一个高代价的数据库操做以后被建立。咱们能够缓存该对象,在下一个请求时返回它的克隆,在须要的时候更新数据库,以此来减小数据库调用。
public interface Cloneable { Object clone(); }
适配器模式(Adapter Pattern)是做为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
略,简单来讲就是随意调用,相似于行为型地中介者模式。
桥接(Bridge)是用于把抽象化与实现化解耦,使得两者能够独立变化。这种类型的设计模式属于结构型模式,它经过提供抽象化和实现化之间的桥接结构,来实现两者的解耦。
这种模式涉及到一个做为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。
咱们经过下面的实例来演示桥接模式(Bridge Pattern)的用法。其中,可使用相同的抽象类方法可是不一样的桥接实现类,来画出不一样颜色的圆。
略,简单来讲就是将多种维度的属性从继承关系转化为组合关系。
过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式容许开发人员使用不一样的标准来过滤一组对象,经过逻辑运算以解耦的方式把它们链接起来。这种类型的设计模式属于结构型模式,它结合多个标准来得到单一标准。
public interface Filter { List<Object> filter(List<Object> list); }
组合模式(Composite Pattern),又叫部分总体模式,是用于把一组类似的对象看成一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及总体层次。这种类型的设计模式属于结构型模式,它建立了对象组的树形结构。
这种模式建立了一个包含本身对象组的类。该类提供了修改相同对象组的方式。
public interface Node { List<Node> getSubNodeList(); }
装饰器模式(Decorator Pattern)容许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是做为现有的类的一个包装。
这种模式建立了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
public interface Shape { } public interface ShapeDecorator { void setShape(Shape shape); void doSomething(); }
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端能够访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
public interface Shape { } public interface ShapeMaker { void doSomethingComplex(); }
享元模式(Flyweight Pattern)主要用于减小建立对象的数量,以减小内存占用和提升性能。这种类型的设计模式属于结构型模式,它提供了减小对象数量从而改善应用所需的对象结构的方式。
享元模式尝试重用现有的同类对象,若是未找到匹配的对象,则建立新对象。
略,简而言之就是单例的复杂状况。
在代理模式(Proxy Pattern)中,一个类表明另外一个类的功能。这种类型的设计模式属于结构型模式。
略,简单来讲就是替换类型并作一些外在包装。
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求建立了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,一般每一个接收者都包含对另外一个接收者的引用。若是一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
public interface Chain { Chain nextChain(); void doSomething(); }
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找能够处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
public interface Receiver { void doAction(); } public interface Command { void execute(); } public interface Invoker { void execute(); }
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。
public interface Expression { boolean interpret(String context); } public class TerminalExpression implements Expression { …… } public class AndExpression implements Expression { …… }
迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中很是经常使用的设计模式。这种模式用于顺序访问集合对象的元素,不须要知道集合对象的底层表示。
public interface Iterator { Obejct first(); boolean hasNext(); Object next(); } public interface Aggregate { Iterator createIterator(); }
中介者模式(Mediator Pattern)是用来下降多个对象和类之间的通讯复杂性。这种模式提供了一个中介类,该类一般处理不一样类之间的通讯,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
public interface Mediator { void doAllThings(); }
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。
public interface Memento { void setState(int state); int getState(); } public interface Originator { void restore(Memento memento); Memento createMemento(); } public interface Caretaker { Memento getMemento(int i); void addMemento(Memento memento); }
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。好比,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
public interface Observer { void update(); } public interface Subject { void attach(Observer o) void detach(Observer o); void notify(); }
在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。在状态模式中,咱们建立表示各类状态的对象和一个行为随着状态对象改变而改变的 context 对象。
public interface State { void handle(); } public interface Context { void setState(State s); State getState(); }
有两种含义:
在空对象模式中,咱们建立一个指定各类要执行的操做的抽象类和扩展该类的实体类,还建立一个未对该类作任何实现的空对象类,该空对象类将无缝地使用在须要检查空值的地方。
// 含义1:取代null的检查 public interface Nullable { boolean isNull(); } // 含义2:不作任何动做的关系 public interface Command { void handle(); } public class NullCommand implements Command { public void handle() { return; } }
在策略模式(Strategy Pattern)中,一个类的行为或其算法能够在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,咱们建立表示各类策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
public interface Strategy { void strategy(); }
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类能够按须要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
略,其实继承状况下,就是对某些方法提供默认实现,对某些方法容许重写覆盖。
在访问者模式(Visitor Pattern)中,咱们使用了一个访问者类,它改变了元素类的执行算法。经过这种方式,元素的执行算法能够随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就能够处理元素对象上的操做。
public interface Visitor { void visit(Element e); } public interface Element { void accept(Visitor v); } // 一般在accept中,调用v.visit(this)来进行访问操做。