简单工厂不是一个标准的设计模式,但是它实在是太常用了,简单而又神奇,所以还是需要好好掌握的,就当是对学习设计模式的热身运动吧。为了保持一致性,我们尽量按照学习其它模式的步骤来进行学习。

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,示例代码如下:

Java代码/**

* 某个接口(通用的、抽象的、非具体的功能)

*/

public interface Api {

/**

* 某个具体的功能方法的定义,用test1来演示一下。

* 这里的功能很简单,把传入的s打印输出即可

* @param s 任意想要打印输出的字符串

*/

public void test1(String s);

}

(2)既然有了接口,自然就要有实现,定义实现Impl,示例代码如下:

Java代码/**

* 对接口的实现

*/

public class Impl implements Api{

public void test1(String s) {

System.out.println("Now In Impl. The input s=="+s);

}

}

(3)那么此时的客户端怎么写呢?

按照Java的知识,接口不能直接使用,需要使用接口的实现类,示例代码如下:

Java代码/**

* 客户端:测试使用Api接口

*/

public class Client {

public static void main(String[] args) {

Api api = new Impl();

api.test1("哈哈,不要紧张,只是个测试而已!");

}

}

1.4  有何问题

上面写得没错吧,在Java的基础知识里面就是这么学的,难道这有什么问题吗?

请仔细看位于客户端的下面这句话:

Java代码Api api = new Impl();

然后再想想接口的功能和思想,发现什么了?仔细再想想?

你会发现在客户端调用的时候,客户端不但知道了接口,同时还知道了具体的实现就是Impl。而接口的思想是“封装隔离”,而Impl这个实现类,应该是被接口Api封装并同客户端隔离开的,也就是说,客户端根本就不应该知道具体的实现类是Impl。

有朋友说,那好,我就把Impl从客户端拿掉,让Api真正的对实现进行“封装隔离”,然后我们还是面向接口来编程。可是,新的问题出现了,当他把“new Impl()”去掉过后,发现他无法得到Api接口对象了,怎么办呢?

把这个问题描述一下:在Java编程中,出现只知接口而不知实现,该怎么办?

就像现在的Client,它知道要使用Api接口,但是不知由谁实现,也不知道如何实现,从而得不到接口对象,就无法使用接口,该怎么办呢?

请看下节:解决方案

本文链接:研磨设计模式之简单工厂模式(场景问题),转自:http://chjavach.iteye.com/blog/800325

工厂模式 java场景_研磨设计模式之简单工厂模式(场景问题)相关推荐

  1. python工厂模式 简书_[Python设计模式] 01 - 简单工厂模式

    设计模式的目的是让代码易维护.易扩展,不能为了模式而模式,因此一个简单的工具脚本是不需要用到任何模式的. 简单工厂模式又叫静态工厂方法模式,工厂模式家族中最简单的一种模式.这个模式的基本工作方式: 通 ...

  2. 研磨设计模式之简单工厂模式-3

    3  模式讲解 3.1  典型疑问 首先来解决一个常见的疑问:可能有朋友会认为,上面示例中的简单工厂看起来不就是把客户端里面的"new Impl()"移动到简单工厂里面吗?不还是一 ...

  3. Java实例_综合实践5.简单工厂模式

    package ch05.factory;class Auto { // 抽象产品类public void start() { // 规定各个子类应具有的行为// 此处编写任何代码都没有实际意义 (子 ...

  4. java设计模式之简单工厂模式

    定义: 由一个工厂对象决定创建出哪一种产品类的实例 类型:属于创建型,但不属于GOF23中设计模式 工厂模式分为三种: 1.简单工厂模式(静态工厂方法模式) 2.工厂方法模式(多态性工厂模式) 3.抽 ...

  5. 设计模式之简单工厂模式(Java 实现)

    设计模式之简单工厂模式(Java 实现) 本文首发于http://www.imooc.com/wiki/Designlesson/factory.html 简单工厂模式是平时开发过程中最常见的设计模式 ...

  6. Java设计模式之 简单工厂模式和工厂方法实验报告书

    目录 Java设计模式之 1 简单工厂模式和工厂方法实验报告书 1 实验四:简单工厂模式和工厂方法 2 一.实验目的 2 二.实验内容 2 三.实验步骤 2 3.1简单工厂模式:女娲 2 3.2简单工 ...

  7. JAVA设计模式笔记(简单工厂模式)

    有一个水果加工工厂,我们的需求是实现加工水果的功能.常见的做法是创建一个水果抽象类,写一个抽象的加工方法,然后创建具体的水果类去继承抽象类,再去实现抽象方法,最后客户端再去新建对象实例. public ...

  8. 设计模式 可复用面向对象软件的基础_面向对象的可复用设计模式之简单工厂模式(1/24)...

    在程序中,需要创建的对象很多,导致对象的new操作多且杂时,需要使用工厂模式: 由于对象的创建过程是我们不需要去关心的,而我们注重的是对象的实际操作,所以,我们需要分离对象的创建和操作两部分,如此,方 ...

  9. 设计模式之 - 简单工厂模式

    一.什么是简单工厂模式 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式.在简单工厂模式中,一个抽 ...

最新文章

  1. [16] 螺旋面(Spire)图形的生成算法
  2. WPF中的依赖项属性
  3. boot spring 对参数检测_【springboot】@Valid参数校验
  4. [TCP/IP] TCP在listen时的参数backlog的意义
  5. 保护SQL Server数据库的十大绝招
  6. 分享:一款快速传输大文件、支持英文版的工具
  7. ssl2648-线段树练习5【线段树】
  8. 并不对劲的[USACO07NOV,洛谷p2886]Cow Relays
  9. cesium画飞线_基于Cesium绘制抛物弧线
  10. 看了IDC 2018 Q1存储报告,才知道宏杉科技为什么稳稳的
  11. 红帽Linux登录密码忘了,redhat linux忘记登陆密码之解决办法
  12. 支持向量机(股票)——Python量化
  13. 推荐一款自动更新 Docker 镜像与容器的神器 Watchtower
  14. 解决vue项目路由出现message: “Navigating to current location (XXX) is not allowed“的问题(点击多次跳转)
  15. 解决 win10系统zookeeper启动闪退分析
  16. R语言学习笔记:使用reshape2包实现整合与重构
  17. 无法启动此程序因为计算机丢失zlib.dll,zlib1.dll怎么修复?zlib1.dll丢失解决方法及注意事项...
  18. 决策智能概念里的风起云涌
  19. 为什么重写HashCode和Equals
  20. 创建一个抽象类动物类以及以下几个接口:进食的接口、睡觉的接口、思考的接口、说话的接口。分别定义猫类、人类、鸟类继承动物类并选择实现上述的接口,并创建实例验证。

热门文章

  1. 英国Carmarthen Learning Centre校长Mr Stuart来华访问,与荣新IT培训中心达成教学合作关系...
  2. keras中文文档_【DL项目实战02】图像识别分类——Keras框架+卷积神经网络CNN(使用VGGNet)
  3. Project查看资源分配情况
  4. Spring IO platform
  5. struts2访问jsp页面404
  6. Java BufferedWriter close()方法与示例
  7. java的equals方法_Java LocalDateTime类| 带示例的equals()方法
  8. python上传本地文件到ftp_python实现的简单FTP上传下载文件实例
  9. 非你莫属 java全球排名_TIOBE:2018年5月全球编程语言排行榜
  10. python 示例_Python中带有示例的class关键字