- 浏览: 46878 次
- 性别:
- 来自: 北京
文章分类
最新评论
简单工厂
简单工厂不是一个标准的设计模式,但是它实在是太常用了,简单而又神奇,所以还是需要好好掌握的,就当是对学习设计模式的热身运动吧。
为了保持一致性,我们尽量按照学习其它模式的步骤来进行学习。
1 场景问题
大家都知道,在Java应用开发中,要“面向接口编程”。
那么什么是接口?接口有什么作用?接口如何使用?一起来回顾一下:
1.1 接口回顾
(1)Java中接口的概念
在Java中接口是一种特殊的抽象类,跟一般的抽象类相比,接口里面的所有方法都是抽象方法,接口里面的所有属性都是常量。也就是说,接口里面是只有方法定义而不会有任何方法实现。
(2)接口用来干什么
通常用接口来定义实现类的外观,也就是实现类的行为定义,用来约束实现类的行为。接口就相当于一份契约,根据外部应用需要的功能,约定了实现类应该要实现的功能,但是具体的实现类除了实现接口约定的功能外,还可以根据需要实现一些其它的功能,这是允许的,也就是说实现类的功能包含但不仅限于接口约束的功能。
通过使用接口,可以实现不相关类的相同行为,而不需考虑这些类之间的层次关系,接口就是实现类对外的外观。
(3)接口的思想
根据接口的作用和用途,浓缩下来,接口的思想就是“封装隔离”。
通常提到封装是指对数据的封装,但是这里的封装是指“对被隔离体的行为的封装”,或者是“对被隔离体的职责的封装”;而隔离指的是外部调用和内部实现,外部调用只能通过接口进行调用,而外部调用是不知道内部具体实现的,也就是说外部调用和内部实现是被接口隔离开的。
(4)使用接口的好处
由于外部调用和内部实现被接口隔离开了,那么只要接口不变,内部实现的变化就不会影响到外部应用,从而使得系统更灵活,具有更好的扩展性和可维护性,这也就是所谓“接口是系统可插拔性的保证”这句话的意思。
(5)接口和抽象类的选择
既然接口是一种特殊的抽象类,那么在开发中,何时选用接口,何时选用抽象类呢?
对于它们的选择,在开发中是一个很重要的问题,特别总结两句话给大家:
- 优先选用接口
-
在如下情况应选择抽象类:既要定义子类的行为,又要为子类提供公共的功能
1.2 面向接口编程
面向接口编程是Java编程中的一个重要原则。
在Java 程序设计里面,非常讲究层的划分和模块的划分。通常按照三层来划分Java程序,分别是表现层、逻辑层、数据层,它们之间都要通过接口来通讯。
在每一个层里面,又有很多个小模块,一个小模块对外也应该是一个整体,那么一个模块对外也应该提供接口,其它地方需要使用到这个模块的功能,都应该通过此接口来进行调用。这也就是常说的“接口是被其隔离部分的外观”。基本的三层结构如图1所示:
图1 基本的三层结构示意图
在一个层内部的各个模块交互也要通过接口,如图2所示:
图2 一个层内部的各个模块交互示意图
各个部分的接口具体应该如何去定义,具体的内容是什么,不去深究,那是需要具体问题具体分析的,这里只是来学习设计的方法。
上面频频提到“组件”,那么什么是组件呢?先简单的名词解释一下:
所谓组件:从设计上讲,组件就是能完成一定功能的封装体。小到一个类,大到一个系统,都可以称为组件,因为一个小系统放到更大的系统里面去,也就当个组件而已。事实上,从设计的角度看,系统、子系统、模块、组件等说的其实是同一回事情,都是完成一定功能的封装体,只不过功能多少不同而已。
继续刚才的思路,大家会发现,不管是一层还是一个模块或者一个组件,都是一个被接口隔离的整体,那么下面我们就不去区分它们,统一认为都是接口隔离体即可,如图3所示:
图3 接口隔离体示意图
既然在Java中需要面向接口编程,那么在程序中到底如何使用接口,来做到真正的面向接口编程呢?
1.3 不用模式的解决方案
回忆一下,以前是如何使用接口的呢,假设有一个接口叫Api,然后有一个实现类Impl实现了它,在客户端怎么用这个接口呢?
通常都是在客户端创建一个Impl的实例,把它赋值给一个Api接口类型的变量,然后客户端就可以通过这个变量来操作接口的功能了,此时具体的结构图如图4:
图4 基本的接口和实现
还是用代码来说明,会更清楚一些。
(1)先定义接口Api,示例代码如下:
- /**
- * 某个接口(通用的、抽象的、非具体的功能)
- */
- public interface Api {
- /**
- * 某个具体的功能方法的定义,用test1来演示一下。
- * 这里的功能很简单,把传入的s打印输出即可
- * @param s 任意想要打印输出的字符串
- */
- public void test1(String s);
- }
(2)既然有了接口,自然就要有实现,定义实现Impl,示例代码如下:
- /**
- * 对接口的实现
- */
- public class Impl implements Api{
- public void test1(String s) {
- System.out.println("Now In Impl. The input s=="+s);
- }
- }
(3)那么此时的客户端怎么写呢?
按照Java的知识,接口不能直接使用,需要使用接口的实现类,示例代码如下:
- /**
- * 客户端:测试使用Api接口
- */
- public class Client {
- public static void main(String[] args) {
- Api api = new Impl();
- api.test1("哈哈,不要紧张,只是个测试而已!");
- }
- }
1.4 有何问题
上面写得没错吧,在Java的基础知识里面就是这么学的,难道这有什么问题吗?
请仔细看位于客户端的下面这句话:
然后再想想接口的功能和思想,发现什么了?仔细再想想?
你会发现在客户端调用的时候,客户端不但知道了接口,同时还知道了具体的实现就是Impl。而接口的思想是“封装隔离”,而Impl这个实现类,应该是被接口Api封装并同客户端隔离开的,也就是说,客户端根本就不应该知道具体的实现类是Impl。
有朋友说,那好,我就把Impl从客户端拿掉,让Api真正的对实现进行“封装隔离”,然后我们还是面向接口来编程。可是,新的问题出现了,当他把“new Impl()”去掉过后,发现他无法得到Api接口对象了,怎么办呢?
把这个问题描述一下:在Java编程中,出现只知接口而不知实现,该怎么办?
就像现在的Client,它知道要使用Api接口,但是不知由谁实现,也不知道如何实现,从而得不到接口对象,就无法使用接口,该怎么办呢?
注:本文转自 http://chjavach.iteye.com
发表评论
-
观察者(Observer)模式
2011-07-07 09:05 843观察者(Observer)模式又名发布-订阅(Publis ... -
设计模式-配套源代码.rar
2011-07-05 11:11 632不多说,直接上源码。。 -
研磨设计模式之工厂方法模式-5
2011-07-05 11:10 6763.3 平行的类层次结 ... -
研磨设计模式之工厂方法模式-4
2011-07-05 11:09 5453.2 工厂方法模式与IoC/DI IoC——Inv ... -
研磨设计模式之工厂方法模式-3
2011-07-05 11:08 5983 模式讲解 3.1 ... -
研磨设计模式之工厂方法模式-2
2011-07-05 11:08 6232 解决方案 2.1 ... -
模式1.研磨设计模式之工厂方法模式-1
2011-07-05 11:07 674工厂方法模式(Factory Method) 1 ... -
研磨设计模式之桥接模式-4
2011-07-05 11:04 6663.4 广义桥接-Java中无处不桥接 ... -
研磨设计模式之桥接模式-3
2011-07-05 11:04 6403 模式讲解 3.1 认 ... -
研磨设计模式之桥接模式-2
2011-07-05 11:03 6872 解决方案 2.1 桥接模式来解决 ... -
模式4.研磨设计模式之桥接模式-1
2011-07-05 11:02 743来写一个大家既陌生又熟悉的设计模式,也是非常实用的一个设 ... -
研磨设计模式之策略模式-6
2011-07-05 10:57 7263.4 策略模式结合模 ... -
研磨设计模式之策略模式-5
2011-07-05 10:56 662接策略模式-4,其实是讲的一个主题,写在一个里面超长了,只 ... -
研磨设计模式之策略模式-4
2011-07-05 10:55 6733.3 Context和Strategy的 ... -
研磨设计模式之策略模式-3
2011-07-05 10:54 6573 模式讲解 3.1 认识策略模式 (1)策略模 ... -
研磨设计模式之策略模式-2
2011-07-05 10:53 7852 解决方案 2.1 策 ... -
模式2.研磨设计模式之策略模式-1
2011-07-05 10:52 660首先感谢众多朋友的支持、评论和鼓励,只有多多努力,写点 ... -
研磨设计模式之单例模式-4
2011-07-05 10:50 8553.8 在Java中一种更好的单例实现方式 ... -
研磨设计模式之单例模式-3
2011-07-05 10:49 6913.3 延迟加载的思想 单例模式的懒汉 ... -
研磨设计模式之单例模式-2
2011-07-05 10:48 8693 模式讲解 3.1 认识单例模式 (1)单例模式 ...
相关推荐
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
研磨设计模式之 工厂方法模式.doc
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
单例模式、工厂方法模式、策略模式、命令模式和桥接模式。
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...
研磨设计模式系列,包括: 单例模式、工厂方法模式、策略模式、命令模式和桥接模式
Java牛人精华之作,制成PDF格式电子书,分享
先写写设计模式方面的内容吧,就是GoF的23个模式,先从大家最熟悉的工厂方法模式开始,这个最简单,明白的人多,看看是否能写出点跟别人不一样的东西,欢迎大家来热烈讨论,提出建议或意见,并进行批评指正,一概...
《研磨设计模式》这本书的心得,一共24个模式,每两个一篇文档。最后还有一篇整体的读数心得。原本打算贴到博客上的,没时间,算了,直接以资源形式发布吧。
《研磨设计模式》书中的例子 --第二章:简单工厂 本质:选择实现 --第三章:外观模式(Facade) 本质:封装交互,简化调用 --第四章:适配器模式(Adapter) 本质:转换匹配,复用功能 --第五章:单例模式(Singleton) ...
水泥配料计算机控制系统的设计及应用全文共5页,当前为第1页。水泥配料计算机控制系统的设计及应用全文共5页,当前为第1页。 水泥配料计算机控制系统的设计及应用全文共5页,当前为第1页。 水泥配料计算机控制系统的...
那么,如果想成为一个有深度的男人(程序猿),还是应该好好的学习一下该开源框架的源码,从而可以更好的领会设计模式的精髓(面试?)。 )。实际上可能是平常的业务开发中,并不会去深究各个框架的源代码,也常常...