设计模式在软件开发者中很是受欢迎的。每一个设计模式都是对常见软件问题的通用的描述解决方案。java
咱们使用设计模式的好处有:算法
Java设计模式被分红了三类-建立型、结构型和行为型的设计模式。这种划分就是全部我写的设计模式的一个目录索引。数据库
建立型设计模式可使用规范方案中最合适的方式来实体化一个对象。windows
单例模式约束了一个类的实例化而且确保在JVM中只会存在一个类的实例。这个看起来很是简单的设计模式可是在实现起来的时候会带来不少的实现问题。单例模式的实如今开发中中一般是一个有争议性的话题。看下Singleton Design Pattern文章来了解到实现单例模式的不一样方法还有每一个方法的优势和缺点。设计模式
当咱们有一个父类并且它有多个子类子,咱们须要还有依赖输入返回一个子类,那咱们就须要使用工厂设计模式了。这个方法将一个实例化类的职责从客户端程序拿到了工厂类中。咱们能够在工厂类中应用单例模式或者将工厂方法设置为static类型的。看下Factory Design Pattern的例子了解工厂模式的优点。函数
抽象工厂模式和工厂模式相似,它是工厂的工厂。若是你对工厂摸是熟悉的话那么你会注意到咱们有一个根据给定的输入返回不一样的子类,工厂类可使用if-else或者switch语句来达到这个目的。ui
在抽象工厂模式中,咱们不在使用if-else快并且对于每个子类都有一个工厂类,而且有一个根据输入的工厂类返回子类的抽象工厂类。看Abstract Factory Pattern来了解如何用代码实现这个模式。编码
这个模式被引入是为了解决一个对象有不少属性的时候用工厂和抽象工厂设计模式的一些问题。建造者模式经过提供一个一步步构建的方式来解决含有大量可选参数和不一致状态的问题,而且提供了能够真正返回最终对象的方法。看下文章Builder Pattern来看下实例和在JDK中使用的相关类。spa
原型模式被用在当一个对象的建立是有大量的代价并且须要大量的时间和资源而且你有一个已经存在的类似的对象的时候。因此这个模式提供了将原始对象复制到新的对象的机制,并且你能够根据你的须要修改它。这个模式使用了java克隆来复制对象。操作系统
原型设计模式容许你复制的对象提供能够复制的功能。它不该该是经过其余类来完成的。可是无论怎么说是否使用浅拷贝或者是深拷贝一个对象的属性取决于需求和设计。看文章来Prototype Pattern看简单的示例。
结构型设计模式提供了建立类结构的不一样方式,好比说,使用继承和组合的方式从小的对象来建立打的对象。
适配器设计模式时一个结构型的设计模式,它用于将两个没有关系的接口能够在一块儿起做用。将这些无关的接口组合在一块儿的对象就是一个适配器。拿生活中一个实际的场景,咱们能够把手机充电器当成是一个适配器由于手机电池须要使用3V的电,可是通常状况下电插板只是产生120V或者240V的电。因此手机充电器就是在手机充电板和正常充电板充当一个适配器的。看下文章Adapter Pattern来看下它是如何在Java中应用的。
组合模式是一种结构型设计模式而且被用在当咱们必需要表示一个总体和部分的层次关系时。当咱们须要一种在结构中的全部对象都须要被相同的方式被处理的方式来建立一个结构时,咱们就可使用组合设计模式。
让咱们拿生活中的实例来讲明--一个图是由好比圆和直线、角这些对象组成的结构,并且咱们当咱们须要用颜色来填充的时候,须要把相同的对象使用相同的颜色。那么画是由不一样的部分组成的并且他们都有一些类似的操做。看文章Composite Pattern来看组合模式的不一样组件以及代码例子。
代理模式的目的是为其余对象提供一个代理或者占位来控制访问。这个定义是很清晰的并且代理模式在咱们想去提供对一个函数的访问控制的时候能够被使用。
也就是说咱们在系统中有些能够运行命令的类。如今若是咱们要使用它,这个是OK的,可是若是咱们若是咱们把程序交给客户端应用的话,由于客户端可能去运行一些命令去删除或者修改你不想让它删除的设置或者系统文件,那么这样就会产生问题。看下文章Proxy Pattern来看下具体的实现例子。
享元设计模式被用在当咱们须要去建立一个类的大量对象的时候。由于每个对象每个对象都会消耗内存空间,这个对于好比手机或者嵌入式系统是很是很差的。享元设计模式经过共享对象的方式来减小内存的加载。字符串池的实现就是享元设计模式的最好实现例子。看文章Flyweight Pattern来了解简单的实现过程。
外观模式被用在帮助客户端程序和系统进行更加容易的交互。假设我么有一个接口集合的应用程序去使用MYSQL\Oracle数据库而且生成不一样类型的报告,好比HTML报告,PDF报告等等。因此咱们为了处理不一样类型的数据库咱们须要不一样的接口集。如今一个客户端应用可以使用这些接口去获取须要的数据库链接而且生成报告。可是当复杂性增长或者接口行为的名词让咱们疑惑的时候,客户端程序会是难去维护的。因此咱们就可使用外观模式而且在存在接口的顶部提供一个封装接口来帮助客户端程序。看文章Facade Pattern来看下详细的实现。
当咱们在你接口和实现中有接口层次的时候,桥接模式就能够用于将接口从实现中解耦而且从客户端程序中隐藏详细的实现。像适配器模式同样,它是一个结构型设计模式。
桥接模式的实现听从了多用组合而不是继承的原则。看文章Bridge Pattern的详细实现。
装饰器模式用于修改在运行时对象的功能的。与此同时相同类的其余实例将不会受到影响,因此每一个独立的对象拥有修改后的行为。装饰器模式一个结构型设计模式的一种,并且使用使用抽象类或者接口的组合方式来实现的。
咱们使用继承或者组合去扩展一个对象的行为可是这个在编译的时候就已经完成了,而且这个能够应用到全部的类的实例上。咱们不能在运行的时候添加新的功能 或者移除任何已经存在的行为--这时候咱们就须要使用装饰器模式了。看文章Decorator Pattern来看下详细的实现。
行为型设计模式为在对象之间进行更好的交互以及如何提供不用耦合和灵活的扩展提供了解决方案。
模板方法是一个行为型设计模式并且它用于建立一个方法stub并且推迟了一些的实现步骤到子类中。模板方法定义了运行一个算法的步骤并且它可以提供有多是全部的或者部分子类的公共的默认实现。
假设咱们想去使用一个算法来建造一个房子。为了建造房子须要有的步骤包括-打地基、打柱子、垒墙而且安窗户。很重的一点就是咱们不嗯呢该改变这些顺序由于咱们不在打地基以前就安窗户。在这个实力中咱们可以建立一个可使用不一样方法构建屋子的模板方法。看文章Template Method Pattern来看具体的实现和代码。
中介者设计模式用于提供一个在系统中的不一样对象之间中间的交流媒介。中介者设计模式在一个有不少对象须要彼此交互的企业级应用中是很是有用的。若是对象直接彼此交互,那么系统就会牢牢的耦合在一块儿从而使维护花费更大并且不利于灵活的进行扩展。中介者模式的目的是提供了对象之间的联系而且帮助对象之间的解耦。
空中交通指挥员就是一个中介者模式使用很棒的例子,由于机场控制室充当了各个航班的联系的中介者。中介者在对象之间充当路由器而且它能够有本身的逻辑来提供交流联系的方式。看文章Mediator Pattern来代码的具体实现。
责任链模式用于在软件设计中有来自客户端的请求须要传递给一串对象来处理的场景中解耦的。在链中的对象将会决定谁将处理这个状况而且这个请求是否须要传递给链中的下一个对象。
咱们清楚咱们在一个try-cathc代码块中能够有多个catch块。这里每个catch块都是一种形式的处理器去处理特殊的异常。因此当在try中出现任何异常的时候,它会传递给第一个catch块。若是catch块没办法处理它,它会将状况传递给下个对象。即便最后一个catch块没办法处理它,那么异常将会抛出到链的外面到调用它的程序。
ATM分发机逻辑就是使用了Chain of Responsibility Pattern的实现,看下连接。
观察者模式在你对一个对象的状态感兴趣而且但愿在任什么时候候发生改变的时候都可以获得通知的场景下是颇有用的。在观察者模式中,观察其余对象的状态的对象被称为Observer,而被观察的对象被称为Subject。
Java经过java.util.Observable类和java.util.Observer接口提供了内置的观察者模式的实现。的可是由于这个实现很是的简单并且大部分的时候咱们不想经过扩展一个类来实现观察者模式由于java不提供类的多继承,因此它被使用的不普遍。
Java消息服务(JMS)使用中介者模式中在介者模式中一块来容许应用来订阅和发布数据到其余的应用中。看文章Observer Pattern来具体的实现和示例程序。
策略模式被用在当咱们对于一个指定的任务有多个算法的时候并且客户端在运行时决定实际的使用实现算法。
策略模式也被熟知是Policy Pattern。咱们定义多个算法并且让客户端传递须要使用的算法做为参数。诠释最好的例子就是 Collections.sort() 方法的Comparator 参数。基于不一样的比较器接口的实现,对象就会使用不一样的方法来进行排序。
看文章Strategy Pattern来看具体的实现和实例程序。
命令模式用于在请求应答模型中解耦和的。在命令模式中,一个请求被你发送给调用者(invoker)并且invoker把它传递给封装好的command对象。command对象将请求传递给合适的接收者(receiver)来进行处理。
能够这样解释,咱们想去为一个文件系统一个可以打开、写和关闭的方法并且它可以支持例如windows和Unix等多个操做系统。为了系统咱们的文件系统,首先咱们须要建立最后实际工做 的receiver类。由于咱们是以java接口的形式来编码,咱们须要有FileSystemReceiver 接口和它的针对不一样的OS的具体实现类,例如 Windows, Unix, Solaris 等等。看文章Command Pattern的具体实现以及代码实例。
状态模式用于当一个对象须要基于它的内部状态来改变他的行为的时候。
若是咱们必须必须根据他的状态来它的行为时,咱们能够在对象的内部设置一个状态变量而后使用if-else条件块来表示基于不一样状态的行为。状态模式用于提供一个系统的低耦合的方法来经过上下文和状态继承来实现的。看文章State Pattern来看具体的详细实现以及代码实例。
访问者模式被用于当咱们必须在一组类似的对象中进行一个操做的时候。使用访问者模式,咱们能够讲操做逻辑从一个对象移到另一个类中。
例如,想象一个超市的手推车咱们能够在里面添加不一样的东西,当咱们点击出帐按钮时,它就会计算须要付钱的总量。如今咱们有在具体的计算逻辑或者咱们能够把这个逻辑使用观察者模式移到其余的类中。看文章Visitor Pattern来看看那具体的实现。
解释器模式用于对于一个语言定义语法的表示而且提供处理这种语法的解释器。
这个模式的最好的例子就是java编译器来将java源代码解释成JVM可以理解的字节码。Google的翻译器就是解释器模式的例子,以任何语言的输入咱们均可以获得被翻译成的另外语言。看文章Interpreter Pattern来看下例子。
迭代器模式是一种行为型模式,它用于提供一个标准的方式去遍历一组对象。迭代器模式中带Java集合中获得了大范围的应用。
迭代器模式不只仅只是遍历一个集合,咱们能够根据咱们的需求提供不一样类型的迭代器。迭代器模式隐藏了遍历集合的具体实现,客户端程序只须要使用迭代器方法。看文章Iterator Pattern来看下具体的实现。
备忘录设计模式用于当咱们想去保存一个对象的状态而后在后来恢复这个状态的状况下。备忘录模式经过首先保存这个对象的状态数据可是不能经过外部对象来访问,从而保护了保存数据的完整性。
备忘录模式时经过两个对象来实现的– Originator 和 Caretaker。Originator就是那个状态须要保存和恢复的对象,它使用了内部类来保存对象的状态。这个内部类就是被称为备忘录并且他是私有的,全部并不能经过其余对象来访问它。看文章Memento Pattern来看下程序例子和详细的实现。
这就是java 中全部的不一样的设计模式,这篇文章提供了更容易浏览全部模式的目录索引。