java设计模式选择题复习
JAVA精彩试题及问题详解

JAVA精彩试题及问题详解Java程序设计复习题一、单项选择题1、一个Java程序运行从上到下的环境次序是( C )A.操作系统、Java程序、JRE/JVM、硬件B.JRE/JVM、Java程序、硬件、操作系统C.Java程序、JRE/JVM、操作系统、硬件D.Java程序、操作系统、JRE/JVM、硬件2、下面哪些是合法的标识符。
( A )A、personsB、12345C、 *pointD、this3、下说确的是:( C )A.一个可直接运行的Java源文件中可以有多个public类,其中必须有一个和文件同名B.一个可直接运行的Java源文件中可以没有public类C一个可直接运行的Java源文件中只能有一个且和文件同名的public类。
D. 一个可直接运行的Java源文件中可以有多个public类,且可以没有和文件同名的类。
4、在java中定义常量的正确语法为:( C )A . int value=20; B. const int VALUE=20;C. final int VALUE=20;D. int VALUE=20;5、编译一个定义了3个类和10个办法的Java源文件后,会产生多少个字符码文件,扩展名是什么( D )A、13个字节码文件,扩展名是.classB、1个字节码文件,扩展名是.classC、3个字节码文件,扩展名是.javaD、3个字节码文件,扩展名是.class6、下列属于Java语言的特点的一项是( D )。
A、运算符重载B、类间多重继承C、指针操作D、垃圾回收7、在创建Applet应用程序时,需要用户考虑的问题是( B )。
A、窗口如何创建B、绘制的图形在窗口中的位置C、程序的框架D、事件处理8、于Java语言的存回收机制,下列选项中最正确的一项是( C )。
A、Java程序要求用户必须手工创建一个线程来释放存B、Java程序允许用户使用指针来释放存C、存回收线程负责释放无用存D、存回收线程不能释放存对象9、有如下的程序代码,在执行完后x和y的值是多少( D )int x= 8, y=2, z;x=++x*y;z=x/y++;A)x=16, y=2 B)x=16, y=4 C)x=18, y=2 D)x=18, y=310、正确定义一个初始值为20的float类型的变量的语句是:( C )A float #value=20f;B float value#=20;C float _value=20f;D float value=20;11、下语句不能通过编译的是( D )。
java程序设计基础复习题

java程序设计基础复习题Java程序设计基础复习题一、Java基础知识1. Java语言的特点:- 简单性- 面向对象- 可移植性- 健壮性- 多线程- 动态性2. Java的基本数据类型及其取值范围:- 整型:byte, short, int, long- 浮点型:float, double- 字符型:char- 布尔型:boolean3. Java的变量作用域:- 局部变量- 成员变量- 类变量(静态变量)4. Java的控制语句:- 条件语句:if, switch- 循环语句:for, while, do-while5. Java的数组:- 一维数组- 多维数组- 数组的初始化和遍历6. Java的字符串处理:- 字符串的创建- 字符串的常用方法(如equals, length, substring等)二、面向对象编程1. 类和对象的概念:- 类的定义- 对象的创建和使用2. 构造方法:- 构造方法的作用- 重载构造方法3. 封装:- 私有成员- 公共访问器和修改器4. 继承:- 继承的概念- 访问控制和继承的关系5. 多态:- 方法重载- 方法重写- 接口和抽象类6. 接口和抽象类:- 接口的定义和实现 - 抽象类的特点三、Java集合框架1. 集合框架的基本概念: - 集合(Collection) - 映射(Map)2. List接口及其实现: - ArrayList- LinkedList3. Set接口及其实现:- HashSet- TreeSet4. Map接口及其实现:- HashMap- TreeMap5. 迭代器(Iterator): - 迭代器的使用6. 泛型:- 泛型的概念- 泛型在集合中的使用四、异常处理1. 异常的分类:- 编译时异常- 运行时异常2. 异常处理机制:- try-catch- finally- throws3. 自定义异常:- 自定义异常类的定义4. 异常链:- 异常链的概念- 异常链的使用五、输入输出(I/O)流1. Java I/O流的分类: - 字节流- 字符流2. 字节流:- InputStream- OutputStream3. 字符流:- Reader- Writer4. 文件操作:- 文件的创建和删除 - 文件的读写操作5. 缓冲流:- BufferedInputStream - BufferedOutputStream6. 数据流:- DataInputStream- DataOutputStream六、Java多线程1. 线程的概念:- 线程的生命周期- 线程的创建和启动2. 线程同步:- 同步方法- 同步代码块3. 线程通信:- wait()- notify()- notifyAll()4. 线程池:- 线程池的概念- 使用Executor框架5. 并发工具类:- CountDownLatch- CyclicBarrier- Semaphore七、Java网络编程1. 网络编程基础:- IP地址- 端口号2. URL和URLConnection:- URL的使用- URLConnection的使用3. 套接字编程:- ServerSocket- Socket4. 多线程服务器:- 使用线程处理客户端请求八、Java数据库连接(JDBC)1. JDBC的概念:- JDBC的工作原理2. 数据库连接:- DriverManager- Connection3. 执行SQL语句:- Statement- PreparedStatement4. 结果集处理:- ResultSet5. 事务处理:- 事务的概念- 事务的隔离级别九、Java Web基础1. Servlet:- Servlet。
java设计模式考试题

A. 系统的维护与开发B 对象组合与类的继承 C. 系统架构与系统开发 D. 系统复用与系统扩展8、单子模式中 , 两个基本要点 A . 构造函数私有( a b ) 和单子类自己提供单例B. 唯一实例C. 静态工厂方法D. 以上都不对 9、下列模式中 , 属于行为模式的是 ( b )A. 工厂模式 B 观察者 C 适配器 以上都是10、“不要和陌生人说话” 是 ( d ) 原则的通俗表述A. 接口隔离B. 里氏代换C. 依赖倒转 尽可能少的了解D. 迪米特:一个对象应对其他对象 11、构造者的的退化模式是通过合并(c )角色完成退化的。
A. 抽象产品 B 产品 C 创建者D 使用者1、设计模式一般用来解决什么样的问题( a) A. 同一问题的不同表相B 不同问题的同一表相 C. 不同问题的不同表相 D. 以上都不是2、下列属于面向对象基本原则的是 ( c )A. 继承B. 封装C. 里氏代换 D 都不是3、Open-Close 原则的含义是一个软件实体 ( a )A. 应当对扩展开放,对修改关闭 .B. 应当对修改开放,对扩展关闭C. 应当对继承开放,对修改关闭D. 以上都不对4、当我们想创建一个具体的对象而又不希望指定具体的类时,可以使用(a )模式。
A. 创建型B. 结构型 C 行为型 D. 以上都可以5、要依赖于抽象,不要依赖于具体。
即针对接口编程,不要针对实现编程,是( d ) 的表述 A. 开 - 闭原则B. 接口隔离原则C. 里氏代换原则D. 依赖倒转原则 6、依据设计模式思想 , 程序开发中应优先使用的是 ( a ) 关系实现复用。
A, 委派 B. 继承 C 创建D. 以上都不对 复用方式:继承和组合聚合(组合委派)7、设计模式的两大主题是 ( d )12、单子(单例,单态)模式类图结构如下:下列论述中,关于” 0..1 ”表述的不正确的是 ( d )A. 1 表示 ,一个单例类中 , 最多可以有一个实例 .B. ”0..1 ”表示单例类中有不多于一个的实例C. 0 表示单例类中可以没有任何实例D. 0 表示单例类可以提供其他非自身的实例13、对象适配器模式是( a )原则的典型应用。
《java 设计模式》模拟试题

《java 设计模式》模拟试题一、选择题(请将下列问题的正确答案填入括号内,每题5分,共50分)1. 单例模式是一种对象设计模式,它提供了一种创建对象的最佳方式。
在Java中,以下哪种方式可以实现单例模式?A. 饿汉式B. 懒汉式C. 双重校验锁D. 静态内部类2. 观察者模式是一种行为型设计模式,它定义了对象之间的依赖关系,使得当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。
在Java中,以下哪个类是观察者模式的抽象实现?A. java.util.ObserverB. java.util.ObservableC. java.util.EventObjectD. java.util.EventListener3. 工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。
在Java中,以下哪个类是工厂模式的抽象实现?A. java.util.FactoryB. java.util.ProductC. java.util.FactoryMethodD. java.util.AbstractFactory4. 适配器模式是一种结构型设计模式,它通过把一个类的接口变换成客户端所期待的另一种接口,可以帮助不兼容的类一起工作。
在Java中,以下哪个类是适配器模式的抽象实现?A. java.util.AdapterB. java.util.TargetC. java.util.AdapteeD. java.util.Client5. 装饰器模式是一种结构型设计模式,它可以在运行时动态地给对象添加一些额外的职责。
在Java中,以下哪个类是装饰器模式的抽象实现?A. java.util.DecoratorB. ponentC. java.util.ConcreteComponentD. java.util.ExtensionInterface6. 策略模式是一种行为型设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。
Java复习题答案

java复习题答案一、选择题1. 在Java中,哪个关键字用于定义一个类?A. classB. interfaceC. enumD. struct答案:A2. 下列哪个不是Java的基本数据类型?A. intB. floatC. doubleD. string答案:D3. Java中的封装性指的是什么?A. 将数据和方法组合在一起B. 隐藏对象的实现细节C. 允许多个线程同时访问对象D. 允许子类继承父类的方法答案:B4. 在Java中,哪个关键字用于实现继承?A. extendsB. implementsC. overrideD. abstract答案:A5. 下列哪个是Java中的异常处理关键字?A. tryB. catchC. finallyD. All of the above答案:D二、简答题1. 简述Java的多态性。
答:Java的多态性是指允许不同类的对象对同一消息做出响应的能力。
多态性可以通过继承(子类重写父类的方法)和接口(实现接口的方法)来实现。
2. 什么是Java的垃圾回收机制?答:Java的垃圾回收机制是一种自动内存管理功能,它能够识别不再使用的对象,并将它们占用的内存释放,以便重新使用。
三、编程题1. 编写一个Java程序,实现简单的计算器功能,能够进行加、减、乘、除运算。
```javaimport java.util.Scanner;public class Calculator {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("请输入第一个数字:");double num1 = scanner.nextDouble();System.out.print("请选择运算符(+,-,*,/):");char operator = scanner.next().charAt(0);System.out.print("请输入第二个数字:");double num2 = scanner.nextDouble();double result = 0;switch (operator) {case '+':result = num1 + num2;break;case '-':result = num1 - num2;break;case '*':result = num1 * num2;break;case '/':if (num2 != 0) {result = num1 / num2;} else {System.out.println("除数不能为0"); }break;default:System.out.println("无效的运算符");}System.out.println("结果是:" + result);scanner.close();}}```四、论述题1. 论述Java中接口和抽象类的区别。
java设计模式选择题复习

java设计模式选择题复习工厂系列模式的优缺点:1.让用户的代码和某个特定类的子类的代码解耦用户不必知道它所使用的对象是怎样创建的,只需知道该对象有哪些方法2.抽象工厂模式可以为用户创建一系列相关的对象,使用户和创建这些对象的类脱耦MVC模式是不是一种设计模式?为什么MVC不是设计模式,应该是框架/架构模式,因为它的定义是抽象的,没有足够的细节描述使你直接去实现,而只能根据MVC的概念和思想,用几个设计模式组合实现。
举出一个生活中使用装饰者模式的例子,用程序实现思路举个生活中的例子,俗话说“人在衣着马在鞍”,把这就话用装饰者模式的语境翻译一下,“人通过漂亮的衣服装饰后,男人变帅了,女人变漂亮了;”。
对应上面的类图,这里人对应于ConcreteComponent,而漂亮衣服则对应于ConcreteDecorator;设计模式如何分类,每一个类别都有什么特征?设计模式分为3类,分别是:创建型模式、行为型模式、结构型模式。
创建型特点:避免用户直接使用new运算符创建对象。
行为型特点:怎样合理的设计对象之间的交互通信,以及怎样合理的为对象分配职结构型特点:主要用于处理类或对象的组合Java jdk中使用了哪些设计模式1.单例2.静态工厂3.工厂方法4.抽象工厂5.构造者6.原型7.适配器8桥接9.组合10.装饰器11.外观12.享元14.代理15.迭代器16.观察者17.协调者18.模板方法19.策略20.责任链21.命令22.空对象25.解释器面向对象的设计原则有哪些?开闭原则、面向抽象的原则(依赖倒转原则)、多用组合少用继承原则、高内聚-低耦合原则。
观察者模式的推拉有什么不同?使用场景推,具体主题将变化后的数据全部交给具体观察者。
场景:当具体主题认为具体观察者需要这些变换后的数据时,往往采用推数据方式;拉,具体主题不将变化后的数据交给具体观察者,而是提供获得这些数据的方法。
场景:当具体主题不知道具体观察者是否需要这些变换后的数据时,往往采用拉数据的方式。
《JAVA设计模式》期末考试复习资料【范本模板】

《JAVA设计模式》复习资料一、单项选择题1.设计模式起源于()A、机械设计B、建筑工程设计C、水利工程设计D、工业电力化设计2.“不要和陌生人说话”是()原则的通俗表述。
A、接口隔离B、里氏替换C、依赖倒置D、迪米特3.目前常见的设计模式主要有()种。
A、23B、21C、32D、284.以下关于单一职责原则的叙述不正确的是()。
A、单一职责原则的英文名称是Single Responsibility Principle。
B、单一职责原则要求一个类只有一个职责C、单一职责原则有利于对象的稳定,降低类的复杂性D、单一职责原则提高了类之间的耦合性5.以下关于依赖倒置原则的叙述不正确的是()A、依赖倒置原则的简称是DIPB、高层模块不依赖于低层模块,低层模块依赖于高层模块C、依赖倒置原则中高层模块和低层模块都依赖于抽象D、依赖倒置原则实现模块间的松耦合6.下面关于单例模式说法错误的是()A、单例模式是指一个类只有一个实例B、单例类从实现方式上分为懒汉式和饿汉式C、单例类从功能上分为状态单例类和无状态单例类D、可以通过继承的方式对单例类进行扩展得到功能更丰富的单例类7.下面关于工厂方法模式说法错误的是().A、工厂方法模式使一个类是实例化延迟到其子类中B、工厂方法模式中具有抽象工厂、具体工厂、抽象产品和具体产品4个角色C、工厂方法模式可以处理多个产品的多个等级结构D、工厂方法模式可以屏蔽产品类8.在以下情况不适合使用责任职责链模式()A、有多个对象可以处理请求,哪个对象处理该请求在运行时刻自动确定。
B、在需要用比较通用和复杂的对象指针代替简单的指针的时候。
C、你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
D、一个请求需要一系列的处理工作。
9.当我们想创建一个具体的对象而又不希望指定具体的类时,可以使用()模式A、结构型B、创建型C、行为型D、以上都可以10.以下用来描述适配器模式的是( )A、表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
java设计模式考试题

1、设计模式一般用来解决什么样的问题( a)A.同一问题的不同表相 B不同问题的同一表相C.不同问题的不同表相D.以上都不是2、下列属于面向对象基本原则的是( c )A.继承B.封装C.里氏代换 D都不是3、Open-Close原则的含义是一个软件实体( a )A.应当对扩展开放,对修改关闭.B.应当对修改开放,对扩展关闭C.应当对继承开放,对修改关闭D.以上都不对4、当我们想创建一个具体的对象而又不希望指定具体的类时,可以使用( a )模式。
A.创建型B.结构型 C行为型 D.以上都可以5、要依赖于抽象,不要依赖于具体。
即针对接口编程,不要针对实现编程,是( d )的表述A.开-闭原则B.接口隔离原则C.里氏代换原则D.依赖倒转原则6、依据设计模式思想,程序开发中应优先使用的是( a )关系实现复用。
A, 委派 B.继承 C创建 D.以上都不对复用方式:继承和组合聚合(组合委派)7、设计模式的两大主题是( d )A.系统的维护与开发 B 对象组合与类的继承C.系统架构与系统开发D.系统复用与系统扩展8、单子模式中,两个基本要点( a b )和单子类自己提供单例A .构造函数私有 B.唯一实例C.静态工厂方法D.以上都不对9、下列模式中,属于行为模式的是( b )A.工厂模式 B观察者 C适配器以上都是10、“不要和陌生人说话” 是( d )原则的通俗表述A.接口隔离B.里氏代换C.依赖倒转D.迪米特:一个对象应对其他对象尽可能少的了解11、构造者的的退化模式是通过合并( c )角色完成退化的。
A.抽象产品 B产品 C创建者 D使用者12、单子(单例,单态)模式类图结构如下:下列论述中,关于”0..1”表述的不正确的是( d )A.1表示,一个单例类中,最多可以有一个实例.B.”0..1”表示单例类中有不多于一个的实例C.0表示单例类中可以没有任何实例D.0表示单例类可以提供其他非自身的实例13、对象适配器模式是( a )原则的典型应用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
工厂系列模式的优缺点:1.让用户的代码和某个特定类的子类的代码解耦用户不必知道它所使用的对象是怎样创建的,只需知道该对象有哪些方法2.抽象工厂模式可以为用户创建一系列相关的对象,使用户和创建这些对象的类脱耦MVC模式是不是一种设计模式?为什么MVC不是设计模式,应该是框架/架构模式,因为它的定义是抽象的,没有足够的细节描述使你直接去实现,而只能根据MVC的概念和思想,用几个设计模式组合实现。
举出一个生活中使用装饰者模式的例子,用程序实现思路举个生活中的例子,俗话说“人在衣着马在鞍”,把这就话用装饰者模式的语境翻译一下,“人通过漂亮的衣服装饰后,男人变帅了,女人变漂亮了;”。
对应上面的类图,这里人对应于ConcreteComponent,而漂亮衣服则对应于ConcreteDecorator;设计模式如何分类,每一个类别都有什么特征?设计模式分为3类,分别是:创建型模式、行为型模式、结构型模式。
创建型特点:避免用户直接使用new运算符创建对象。
行为型特点:怎样合理的设计对象之间的交互通信,以及怎样合理的为对象分配职结构型特点:主要用于处理类或对象的组合Java jdk中使用了哪些设计模式1.单例2.静态工厂3.工厂方法4.抽象工厂5.构造者6.原型7.适配器8桥接9.组合10.装饰器11.外观12.享元页脚内容114.代理15.迭代器16.观察者17.协调者18.模板方法19.策略20.责任链21.命令22.空对象25.解释器面向对象的设计原则有哪些?开闭原则、面向抽象的原则(依赖倒转原则)、多用组合少用继承原则、高内聚-低耦合原则。
观察者模式的推拉有什么不同?使用场景推,具体主题将变化后的数据全部交给具体观察者。
场景:当具体主题认为具体观察者需要这些变换后的数据时,往往采用推数据方式;拉,具体主题不将变化后的数据交给具体观察者,而是提供获得这些数据的方法。
场景:当具体主题不知道具体观察者是否需要这些变换后的数据时,往往采用拉数据的方式。
策略模式和工厂模式有什么不同?策略模式定义了一系列算法,将他们一个个封装,并且他们之间可以相互替换;工厂模式定义一个创建对象的接口,让子类决定实例化哪一个类5观察者模式的推拉有什么不同?适用场景现在要说的分歧在这里:“推”的方式是指,Subject维护一份观察者的列表,每当有更新发生,Subject会把更新消息主动推送到各个Observer去。
“拉”的方式是指,各个Observer维护各自所关心的Subject列表,自行决定在合适的时间去Subject获取相应的更新数据。
“推”的好处包括:页脚内容21、高效。
如果没有更新发生,不会有任何更新消息推送的动作,即每次消息推送都发生在确确实实的更新事件之后,都是有意义的。
2、实时。
事件发生后的第一时间即可触发通知操作。
3、可以由Subject确立通知的时间,可以避开一些繁忙时间。
4、可以表达出不同事件发生的先后顺序。
缺点:精确性较差,不能保证能把信息送到客户器。
“拉”的好处包括:1、如果观察者众多,Subject来维护订阅者的列表,可能困难,或者臃肿,把订阅关系解脱到Observer 去完成。
2、Observer可以不理会它不关心的变更事件,只需要去获取自己感兴趣的事件即可。
3、Observer可以自行决定获取更新事件的时间。
4、拉的形式可以让Subject更好地控制各个Observer每次查询更新的访问权限。
缺点:不能够及时获取系统的变更。
6策略模式和工厂模式有什么不同?一般情况下,策略模式是为了解决的是策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。
可以应用的场景有优惠系统、工资计算系统等。
而工厂模式主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。
主要应用在多数据库选择,类库文件加载等。
很明显的是策略模式是开放的,作为一个主体你的活动范围是全程的,大多数事情要你自己亲力亲为。
而工厂模式作是封闭的,作为主体的你的活动范围是有限的,很多事情都帮组你做好了,你直接“点”就可以了。
页脚内容37装饰者模式和适配器模式的比较1.关于新职责:适配器也可以在转换时增加新的职责,但主要目的不在此。
装饰者模式主要是给被装饰者增加新职责的。
2.关于原接口:适配器模式是用新接口来调用原接口,原接口对新系统是不可见或者说不可用的。
装饰者模式原封不动的使用原接口,系统对装饰的对象也通过原接口来完成使用。
(增加新接口的装饰者模式可以认为是其变种--“半透明”装饰者)3.关于其包裹的对象:适配器是知道被适配者的详细情况的(就是那个类或那个接口)。
装饰者只知道其接口是什么,至于其具体类型(是基类还是其他派生类)只有在运行期间才知道。
8为什么要用设计模式,设计模式有哪些优点设计模式的优点:1、设计模式融合了众多专家的经验,并以标准的形式给广大群众使用,她提供了一中通用的设计词汇,和一种通用的设计语言,以方便开发人员之间开发和交流,使得设计方案更加通俗易懂;2、设计模式使人们可以方便简单的复用设计模式;3、设计模式是设计方案易于修改;4、设计模式的使用将提高软件开发效率与质量,节约成本;5、设计模式有助于初学者理解面向对象的思想。
页脚内容49学过的每一种模式的适用场景和优缺点职责链模式优点:1.将请求的发送者和接收者解耦2.可以简化你的对象,因为它不需要知道链的结构3.通过改变链内的成员或调动他们的次序,允许你动态地新增或删除责任缺点:1.并不保证请求一定会被执行,如果没有任何对象处理它的话,它可能会落到链尾端之外2.可能不容观察运行时的特征,有碍于除错。
用途:经常被使用在窗口系统中,处理鼠标和键盘之类的事件。
当算法牵涉到一种链型运算,而且不希望处理过程中有过多的循环和条件选择语句,并且希望比较容易的扩充文法,可以采用职责链模式。
页脚内容51)有多个对象处理请求,到底怎么处理在运行时确定。
2)希望在不明确指定接收者的情况下,向多个对象中的一个提交请求。
3)可处理一个请求的对象集合应该被动态指定。
典型例子:一个请求发送给前台,前台表示我无权管理,将请求传递给财务部门,财务部门再……简单工厂模式优点:工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。
而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。
缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;用途:页脚内容6工厂类负责创建的对象比较少;客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。
经典例子:没啥好说的,这不是一个真正的设计模式策略模式优点:1.提供了一种替代继承的方法,而且保持了继承的优点,比继承更独立(算法独立,可以任意扩展)2.避免程序使用多重条件转移语句,使系统更灵活,并易于扩展3.遵守大部分常用设计原则,高内聚,低耦合缺点:1.每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。
可以使用工厂方法来解决。
用途:各个不同地区不同的纳税方法,HF中不同鸭子的方法。
有多种鸭子,每个鸭子都有自己的行为,fly,quaak之类的。
行为有行为类,继承同一接口实现不同操作,以此实现算法互换。
页脚内容7装饰模式优点:1.装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。
2.通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
3.有着比继承更加灵活的特性缺点:由于使用装饰模式,可以比使用继承关系需要较少数目的类。
使用较少的类,当然使设计比较易于进行。
但是,在另一方面,使用装饰模式会产生比使用继承关系更多的对象。
更多的对象会使得查错变得困难,特别是这些对象看上去都很相像。
用途:当需要给一个类添加新的行为的时候,但基于开闭原则,就使用装饰模式。
经典例子:我穿衣服使用draw()方法,在我穿好衣服后,我还打算再寄领带,而寄领带就是装饰类,我们可以把装饰类和对象(穿衣服类)继承于同一个接口,在装饰类的draw()方法中调用super.draw(),然后再在这个方法里加上自己的特征。
页脚内容8工厂方法模式优点:1.良好的封装性,代码结构清晰。
一个对象创建是有条件约束的,如一个调用者需要一个具体的产品对象,只要知道这个产品的类名(或约束字符串)就可以了,不用知道创建对象的艰辛过程,减少模块间的耦合。
2.工厂方法模式的扩展性非常优秀。
在增加产品类的情况下,只要适当地修改具体的工厂类或扩展一个工厂类,就可以完成“拥抱变化”。
例如在我们的例子中,需要增加一个棕色人种,则只需要增加一个BrownHuman类,工厂类不用任何修改就可完成系统扩展。
3.屏蔽产品类。
这一特点非常重要,产品类的实现如何变化,调用者都不需要关心,它只需要关心产品的接口,只要接口保持不表,系统中的上层模块就不要发生变化,因为产品类的实例化工作是由工厂类负责,一个产品对象具体由哪一个产品生成是由工厂类决定的。
在数据库开发中,大家应该能够深刻体会到工厂方法模式的好处:如果使用JDBC连接数据库,数据库从MySql切换到Oracle,需要改动地方就是切换一下驱动名称(前提条件是SQL语句是标准语句),其他的都不需要修改,这是工厂方法模式灵活性的一个直接案例。
4.工厂方法模式是典型的解耦框架。
高层模块值需要知道产品的抽象类,其他的实现类都不用关心,符合迪米特原则,我不需要的就不要去交流;也符合依赖倒转原则,只依赖产品类的抽象;当然也符合里氏替换原则,使用产品子类替换产品父类,没问题!缺点:待补充用途:第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,页脚内容9生产出具体的产品来。
Java Collection中的iterator() 方法即属于这种情况。
第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂的决定权在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,而这个决策过程这对于使用者来说是透明的。