提供了比工厂模式更高一级的接口级,用于返回若个工厂之一。这个模式是属于创建模式之一。有几点值得注意:
public enum CarType { SMALL, SEDAN, LUXURY }
抽象Car类,所有的子类扩展Car这个类实现自己的特有功能。
public abstract class Car { private CarType model = null; public Car(CarType model) { this.model = model; arrangeParts(); } private void arrangeParts() { // Do one time processing here } // Do subclass level processing in this method protected abstract void construct(); public CarType getModel() { return model; } public void setModel(CarType model) { this.model = model; } }
分别定义SmallCar、Sedan和Luxury类。
public class SmallCar extends Car{ SmallCar() { super(CarType.SMALL); construct(); } @Override protected void construct() { System.out.println("Building small car"); // add accessories } }
public class SedanCar extends Car { SedanCar() { super(CarType.SEDAN); construct(); } @Override protected void construct() { System.out.println("Building sedan car"); // add accessories } }
public class LuxuryCar extends Car { LuxuryCar() { super(CarType.LUXURY); construct(); } @Override protected void construct() { System.out.println("Building luxury car"); // add accessories } }定义FactoryCar工厂类,现实具体的调用。
public class CarFactory { public static Car buildCar(CarType model) { Car car = null; switch (model) { case SMALL: car = new SmallCar(); break; case SEDAN: car = new SedanCar(); break; case LUXURY: car = new LuxuryCar(); break; default: // throw some exception break; } return car; } }
测试工厂类,单元测试如下:
public class CarFactoryTest { @SuppressWarnings("deprecation") @Test public void testCarFactory() { Assert.assertEquals(true, CarFactory.buildCar(CarType.SMALL) instanceof Car) ; Assert.assertEquals(true, CarFactory.buildCar(CarType.SEDAN) instanceof Car) ; Assert.assertEquals(true, CarFactory.buildCar(CarType.LUXURY) instanceof Car) ; } }
Building small car Building sedan car Building luxury car
2. 提供一个产品类库,显露接口,但是不包括实现。
3. 修要从超类哪里隔离具体的实现类.
4. 系统需要独立出系统的产品如何创建、组合和呈现。
如果你想做一深入的研究,可以查阅Java API代码.
- java.sql.DriverManager#getConnection()
- java.net.URL#openConnection()
- java.lang.Class#newInstance()
- java.lang.Class#forName()
基本模式
综述
设计模式分为三种类型,共23类。
创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。简单工厂
结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。
按alphabeta排列简介如下。
Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
Adapter(适配器模式):将一个类的接口转换成客户希望的另外一个接口。A d a p t e r模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Bridge(桥接模式):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
Builder(建造者模式):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Chain of Responsibility(职责链模式):为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
Command(命令模式):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
Composite(组合模式):将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。
Decorator(装饰模式):动态地给一个对象添加一些额外的职责。就扩展功能而言, 它比生成子类方式更为灵活。
Facade(外观模式):为子系统中的一组接口提供一个一致的界面, F a c a d e模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
Factory Method(工厂模式):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。
Flyweight(享元模式):运用共享技术有效地支持大量细粒度的对象。
Interpreter(解析器模式):给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。
Iterator(迭代器模式):提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
Mediator(中介模式):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
Memento(备忘录模式):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。
Observer(观察者模式):定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
Prototype(原型模式):用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
Proxy(代理模式):为其他对象提供一个代理以控制对这个对象的访问[1]。
Singleton(单例模式):保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式是最简单的设计模式之一,但是对于Java的开发者来说,它却有很多缺陷。在本月的专栏中,David Geary探讨了单例模式以及在面对多线程(multithreading)、类装载器(classloaders)和序列化(serialization)时如何处理这些缺陷。[2]
State(状态模式):允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
Strategy(策略模式):定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。
Template Method(模板方法模式):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
Visitor(访问者模式):表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
详细描述
从下一节开始,详细描述以下每一种设计模式。
Factory Method
结构
意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
适用性 当一个类不知道它所必须创建的对象的类的时候。
当一个类希望由它的子类来指定它所创建的对象的时候。
当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
Abstract Factory
结构
意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适用性 一个系统要独立于它的产品的创建、组合和表示时。
一个系统要由多个产品系列中的一个来配置时。
当你要强调一系列相关的产品对象的设计以便进行联合使用时。
当你提供一个产品类库,而只想显示它们的接口而不是实现时。
Builder
结构
意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
适用性 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
当构造过程必须允许被构造的对象有不同的表示时。
Prototype
结构
意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
适用性 当要实例化的类是在运行时刻指定时,例如,通过动态装
下表包含了可以有助于使计算机更易于使用的键盘快捷方式。
按键 功能
按住右 Shift 八秒钟 启用和关闭筛选键
按左 Alt+左 Shift+PrtScn(或 PrtScn) 启用或关闭高对比度
按左 Alt+左 Shift+Num Lock 启用或关闭鼠标键
按 Shift 五次 启用或关闭粘滞键
按住 Num Lock 五秒钟 启用或关闭切换键
Windows 徽标键 + U 打开轻松访问中心
下表包含了常规键盘快捷方式。
按键 功能
F1 显示帮助
Ctrl+C 复制选择的项目
Ctrl+X 剪切选择的项目
Ctrl+V 粘贴选择的项目
Ctrl+Z 撤消操作
Ctrl+Y 重新执行某项操作
Delete 删除所选项目并将其移动到“回收站”
Shift+Delete 不先将所选项目移动到“回收站”而直接将其删除
F2 重命名选定项目
Ctrl+向右键 将光标移动到下一个字词的起始处
Ctrl+向左键 将光标移动到上一个字词的起始处
Ctrl+向下键 将光标移动到下一个段落的起始处
Ctrl+向上键 将光标移动到上一个段落的起始处
Ctrl+Shift 加某个箭头键 选择一块文本
Shift 加任意箭头键 在窗口中或桌面上选择多个项目,或者在文档中选择文本
Ctrl 加任意箭头键+空格键 选择窗口中或桌面上的多个单个项目
Ctrl+A 选择文档或窗口中的所有项目
F3 搜索文件或文件夹
Alt+Enter 显示所选项的属性
Alt+F4 关闭活动项目或者退出活动程序
Alt+空格键 为活动窗口打开快捷方式菜单
Ctrl+F4 关闭活动文档(在允许同时打开多个文档的程序中)
Alt+Tab 在打开的项目之间切换
Ctrl+Alt+Tab 使用箭头键在打开的项目之间切换
Ctrl+鼠标滚轮 更改桌面上的图标大小
Windows 徽标键 + Tab 使用 Aero Flip 3-D 循环切换任务栏上的程序
Ctrl + Windows 徽标键 + Tab 通过 Aero Flip 3-D 使用箭头键循环切换任务栏上的程序
Alt+Esc 以项目打开的顺序循环切换项目
F6 在窗口中或桌面上循环切换屏幕元素
F4 在 Windows 资源管理器中显示地址栏列表
Shift+F10 显示选定项目的快捷菜单
Ctrl+Esc 打开「开始」菜单
Alt+加下划线的字母 显示相应的菜单
Alt+加下划线的字母 执行菜单命令(或其他有下划线的命令)
F10 激活活动程序中的菜单栏
向右键 打开右侧的下一个菜单或者打开子菜单
向左键 打开左侧的下一个菜单或者关闭子菜单
F5 刷新活动窗口
Alt+向上键 在 Windows 资源管理器中查看上一级文件夹
Esc 取消当前任务
Ctrl+Shift+Esc 打开任务管理器
插入 CD 时按住 Shift 阻止 CD 自动播放
下表包含了在对话框中使用的键盘快捷方式。
按键 功能
Ctrl+Tab 在选项卡上向前移动
Ctrl+Shift+Tab 在选项卡上向后移动
Tab 在选项上向前移动
Shift+Tab 在选项上向后移动
Alt+加下划线的字母 执行与该字母匹配的命令(或选择选项)
Enter 对于许多选定命令代替单击鼠标
空格键 如果活动选项是复选框,则选中或清除该复选框
箭头键 如果活动选项是一组选项按钮,则选择某个按钮
F1 显示帮助
F4 显示活动列表中的项目
Backspace 如果在“另存为”或“打开”对话框中选中了某个文件夹,则打开上一级文件夹
Windows徽标键就是显示为Windows旗帜,或标有文字Win或Windows的按键,以下简称Win键。XP时代有4个经典的 Win 键组合:R/E/F/L。到了 Win7,花样更多了。
Win:打开或关闭开始菜单。
Win + Pause:显示系统属性对话框。
Win + D:显示桌面。
Win + M:最小化所有窗口。
Win + SHIFT + M:还原最小化窗口到桌面上。
Win + E:打开我的电脑
Win + F:搜索文件或文件夹。
Ctrl + Win + F:搜索计算机(如果您在网络上) 。
Win + L:锁定您的计算机或切换用户。
Win + R:打开运行对话框。
Win + T:切换任务栏上的程序(感觉是和alt+ESC 一样 )
Win + 数字:让位于任务栏指定位置(按下的数字作为序号)的程序,新开一个实例。(感觉这个比较新颖,貌似快速启动。) Shift + Windows logo key +number:Start a new instance of the program pinned to the taskbar in the position indicated by the number.
Ctrl + Win + 数字:让位于任务栏指定位置(按下的数字作为序号)的程序,切换到上一次的活动窗口。 Ctrl+Windows logo key +number:Switch to the last active window of the program pinned to the taskbar in the position indicated by the number.
ALT + Win + 数字:让位于任务栏指定位置(按下的数字作为序号)的程序,显示跳转清单。 Alt+Windows logo key +number: Open the Jump List for the program pinned to the taskbar in the position indicated by the number.
Win + TAB:循环切换任务栏上的程序并使用的Aero三维效果。
Ctrl + Win + TAB:使用方向键来循环循环切换任务栏上的程序,并使用的Aero三维效果。
按Ctrl + Win + B:切换到在通知区域中显示信息的程序
Win + 空格:预览桌面。
Win + ↑:最大化窗口。
Win + ↓:最小化窗口。
Win + ←:最大化到窗口左侧的屏幕上。
Win + →:最大化窗口到右侧的屏幕上。
Win + Home:最小化所有窗口,除了当前激活窗口。
Win+ SHIFT + ↑:拉伸窗口的到屏幕的顶部和底部。
Win+ SHIFT + →/←:移动一个窗口,从一个显示器到另一个。
Win + P:选择一个演示文稿显示模式。
Win + G:循环切换侧边栏的小工具。
Win + U:打开轻松访问中心。
Win + x:打开Windows移动中心。
Ctrl+N 打开新窗口
Ctrl+Shift+N 新建文件夹
End 显示活动窗口的底部
Home 显示活动窗口的顶部
F11 最大化或最小化活动窗口
Num Lock+小键盘星号(*) 显示选中文件夹的所有子文件夹
Num Lock+小键盘加号(+) 显示选中文件夹的内容
Num Lock+小键盘减号(-) 折叠选中文件夹
左方向键 折叠当前展开的选中文件夹或选中上层文件夹
Alt+Enter 打开选中项目的属性对话框
Alt+P 显示预览窗格
Alt+左方向键 切换到前一次打开的文件夹
右方向键 显示(展开)当前选中项目或选中第一个子文件夹
Alt+右方向键 切换到下一次后打开的文件夹
Alt+上方向键 打开上层文件夹
Ctrl+鼠标滚轮 改变文件和文件夹图标的大小和外观
Alt+D 选中地址栏(定位到地址栏)
Ctrl+E 选中搜索框(定位到搜索框)
下表包含了使用放大镜的键盘快捷方式。
按键 功能
Windows 徽标键 + 加号或减号 放大或缩小
Ctrl+Alt+空格键 显示鼠标指针
Ctrl+Alt+F 切换到全屏模式
Ctrl+Alt+L 切换到镜头模式
Ctrl+Alt+D 切换到停靠模式
Ctrl+Alt+I 反色
Ctrl+Alt+箭头键 按箭头键的方向平移
Ctrl+Alt+R 调整镜头的大小
Windows 徽标键 + Esc 退出放大镜
Alt+Page Up 按从左向右顺序切换程序
Alt+Page Down 按从右向左切换程序
Alt+Insert 按程序打开先后顺序循环切换程序
Alt+Home 显示“开始”菜单
Ctrl+Alt+Break 在窗口模式和全屏之间切换
Ctrl+Alt+End 显示Windows安全性对话框
Alt+Delete 显示当前窗口的系统菜单
Ctrl+Alt+-(小键盘减号) 当前活动窗口截图
Ctrl+Alt++(小键盘加号) 全屏截图
Ctrl+Alt+向右键 从远程桌面控件“跳转”到主机程序中的控件(如按钮或文本框)。将远程桌面控件嵌入到其他(主机)程序后,此功能非常有用。
Ctrl+Alt+向左键 从远程桌面控件“跳转”到主机程序中的控件(如按钮或文本框)。将远程桌面控件嵌入到其他(主机)程序后,此功能非常有用。
下表包含了使用画图的键盘快捷方式。
按键 功能
Ctrl+N 创建新的图片
Ctrl+O 打开现有图片
Ctrl+S 将更改保存到图片
F12 将此图片另存为新文件
Ctrl+P 打