创建型
- 工厂方法模式
说明:使用不同的工厂生产不同的产品
例:生产电视机的工厂,生产不同品牌的手机,如果只有一个工厂类,当需要增加一个品牌的手机时就需要修改代码,违反了开闭原则
改进:定义一个工厂接口,再定义不同的实现类分别去生产不同品牌的手机,增加品牌时只需要增加一个实现类即可
定义:工厂方法模式又称为工厂模式,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化那一个具体产品类
应用:如集合框架,Collection定义了iterator()。可返回一个用于遍历集合的Iterator(迭代器)对象,而具体的集合类通过实现该方法返回一个具体的Iterator对象,该iterator()方法就是工厂方法 - 抽象工厂模式
说明:具体的工厂生产不再是生产某一种产品,而是生产一系列产品
例:海尔工厂生产海尔电视机、海尔空调;TCL工厂生产TCL电视机、TCL空调
定义:提供一个创建一系列相关或相互依赖的对象的接口,而无需指定他们具体的类
- 单例模式
例:身份证号码是唯一的
静态私有成员变量、私有构造函数、静态公有获取实例的方法
定义:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类成为单例类,它提供全局访问的方法
应用:如java.lang.Runtime类,每个Java应用程序里,都有唯一的一个Runtime对象,通过这个对象可以与其运行环境发生相互作用。
在流行的JavaEE框架Spring中,当我们试图从spring容器中获取某个类的实例时,默认情况下,spring会通过单例模式进行创建,也就是在spring的bean工厂中这个bean的实例只有一个
<bean id = "date" class = "java.util.Date" scope = "singleton"/>
结构型
- 适配器模式
将一个接口转换成客户希望的另一个接口,从而使接口不兼容的那些类可以一起工作
定义:将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器
应用:数据库连接工具JDBC,使得程序能够与数据库连接,并使用SQL语言来查询和操作数据。JDBC给出一个客户端通用的抽象接口,每一个具体数据库引擎(如SQL Server、Oracle、MySQL等)的JDBC驱动软件都是一个介于JDBC接口和数据库引擎接口之间的适配器软件。抽象的JDBC接口和各个数据库引擎API之间都需要相应的适配器软件,这就是为各个不同数据库引擎准备的驱动程序
- 外观模式
例:网站首页的导航栏,可以进入不同的子系统
定义:外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
外观模式是一个使用频率极高,理解比较容易的模式,在几乎所有的软件中都能见到外观模式的应用,比如绝大多数的B/S系统都有一个首页或者导航页面,在这里,首页和导航页面就是外观角色 - 代理模式
例:找女票,工作忙不能亲自找,找个婚介所(代理、中介、、、)
在某些情况下,一个客户不能或不想直接引用某个对象,此时可以通过一个称之为“代理”的第三者实现间接引用,代理对象起到中介作用,可以通过代理对象去掉客户能看到的内容和服务或者添加客户需要的额外服务
定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用
应用:spring框架中的AOP技术也是代理模式的应用
行为型
- 迭代器模式
例:看电视,通过遥控器,可以看不同的频道,电视机中有很多频道,通过遥控器遍历,而不需要知道这些频道在电视机内部是怎么存储的
定义:提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示
应用:Collection中的iterator()
在Java中,很少自定义迭代器,使用JDK内置的迭代器即可
- 观察者模式
例:点击一个按钮,弹出一个对话框;股票上涨,股民兴奋 在这里,按钮、股民是观察者,鼠标、股票是观察者所观察的目标
MVC架构中,Model提供的数据是视图层所观察的对象,相同的数据在view层可能有不同的表现形式,如果模型层数据发生变化,则图表对象也发生改变,意味着图表对象依赖于模型层提供的数据对象,因此数据对象的任何状态改变都应该立即通知它们
定义:定义对象间一种一对多的关系,使得每当一个对象发生改变时,其相关的依赖对象皆得到通知并自动更新 - 策略模式
用于算法的自由切换和扩展
定义:定义一些列算法,将每一个算法封装起来,并让他们可以相互替换。策略模式让算法独立预使用它们的客户而变化
策略模式的目的是将算法的定义预使用分开,也就是将算法的行为和环境分开,将算法的定义放在专门的策略类中,每一个策略类封装了一种算法实现,同时为了扩展方便,引入了抽象策略类,在抽象策略类中定义了抽象算法,环境类针对抽象策略类进行编程,符合“依赖倒转原则”。在出现心得算法时,只需要增加一个心得实现了抽象策略类的具体策略类。