设计模式之简单工厂(Factory method)设计模式之简单工厂(Factory method)-阿里云开发者社区

开发者社区> 嗯哼9925> 正文

设计模式之简单工厂(Factory method)设计模式之简单工厂(Factory method)

简介:
+关注继续查看

1.参考文献:

http://chjavach.iteye.com/blog/800325

2.解析

在java编程中,我们要做到“面向接口编程”。下面回顾一些接口方面的知识:

(1)Java中接口的概念
在Java中接口是一种特殊的抽象类,跟一般的抽象类相比,接口里面的所有方法都是抽象方法(也因此,接口中的方法可以加abstract,也可以不加)接口里面的所有属性都是常量。也就是说,接口里面是只有方法定义而不会有任何方法实现。
(2)接口用来干什么
通常用接口来定义实现类的外观,也就是实现类的行为定义,用来约束实现类的行为。接口就相当于一份契约,根据外部应用需要的功能,约定了实现类应该要实现的功能,但是具体的实现类除了实现接口约定的功能外,还可以根据需要实现一些其它的功能,这是允许的,也就是说实现类的功能包含但不仅限于接口约束的功能。通过使用接口,可以实现不相关类的相同行为,而不需考虑这些类之间的层次关系,接口就是实现类对外的外观。
(3)接口的思想
根据接口的作用和用途,浓缩下来,接口的思想就是“封装隔离”。通常提到封装是指对数据的封装,但是这里的封装是指“对被隔离体的行为的封装”,或者是“对被隔离体的职责的封装”;而隔离指的是外部调用和内部实现,外部调用只能通过接口进行调用,而外部调用是不知道内部具体实现的,也就是说外部调用和内部实现是被接口隔离开的。
(4)使用接口的好处
由于外部调用和内部实现被接口隔离开了,那么只要接口不变,内部实现的变化就不会影响到外部应用,从而使得系统更灵活,具有更好的扩展性和可维护性,这也就是所谓“接口是系统可插拔性的保证”这句话的意思。
(5)接口和抽象类的选择
既然接口是一种特殊的抽象类,那么在开发中,何时选用接口,何时选用抽象类呢?对于它们的选择,在开发中是一个很重要的问题,特别总结两句话给大家:

  • 优先选用接口
  • 在如下情况应选择抽象类:既要定义子类的行为,又要为子类提供公共的功能。(可以参考博客:Java 接口和抽象类区别,里面有详细在讲述)。

3.实例

下面列举一个简单的面向接口编程的例子。
假设有一个接口叫Api,然后有一个实现类Impl实现了它,在客户端创建一个Impl的实例,把它赋值给一个Api接口类型的变量然后客户端就可以通过这个变量来操作接口的功能了,此时具体的结构图如下图:

4.代码示例

首先定义接口Api
View Code

然后定义接口的实现Impl

View Code

最后定义客户端Client

View Code

上述面向接口编程的例子存在一些问题:

客户端不但知道了接口,同时还知道了具体的实现就是Impl。而接口的思想是“封装隔离”,那么Impl这个具体实现类,就应该是被接口Api封装并同客户端隔离开的,也就是说,客户端根本就不应该知道具体的实现类是Impl(也就是在Client中就不应该出现Impl)。那么应该如何解决这个问题呢?这就是下面需要将的工厂模式来实现。

5.简单工厂

5.1简单工厂定义:

在模块内部新建一个类,在这个类里面来创建接口,然后把创建好的接口返回给客户端,这样外部应用就只需要根据这个类来获取相应的接口对象,然后就可以操作接口定义的方法了。把这样的对象称为简单工厂。

5.2简单工厂结构:

Api: 定义客户所需要的功能接口
Impl:具体实现Api的实现类,可能会有多个
Factory:工厂,选择合适的实现类来创建Api接口对象
Client:客户端,通过Factory去获取Api接口对象,然后面向Api接口编程

6.传入参数的简单工厂代码实例

Api和Impl的实现如上面的代码实例,保持不变,下面给出Impl2、Factory和Client的实现

Impl2.java

View Code

Factory.java

View Code

Client.java

View Code

简单工厂分析

  为什么将new Impl()放在工厂类里面就算是封装完全了呢。这是因为工厂类是存在于模块内部的。接口是用来封装隔离具体的实现的,目标就是不要让客户端知道封装体内部的具体实现。简单工厂的位置是位于封装体内的,也就是简单工厂是跟接口和具体的实现在一起的,算是封装体内部的一个类,所以简单工厂知道具体的实现类是没有关系的。整理一下简单工厂的结构图,如图所示:

图中虚线框,就好比是一个组件的包装边界,表示接口、实现类和工厂类组合成了一个组件,在这个封装体里面,只有接口和工厂是对外的,也就是让外部知道并使用的,所以故意漏了一些在虚线框外,而具体的实现类是不对外的,被完全包含在虚线框内对于客户端而言,只是知道了接口Api和简单工厂Factory,通过Factory就可以获得Api了,这样就达到了让Client在不知道具体实现类的情况下获取接口Api。所以看似简单的把“new Impl()”这句话从客户端里面移动到了简单工厂里面,其实是有了质的变化的。
  虽然说简单工厂的方法多是用来造接口的,但是仔细分析就会发现,真正能实现功能的是具体的实现类,这些实现类(Impl和Impl2这里两个类)是已经做好的,并不是真的靠简单工厂来创造出来的,简单工厂的方法无外乎就是:实现了选择一个合适的实现类来使用。所以简单工厂方法的内部主要实现的功能是“选择合适的实现类”来创建实例对象。既然要实现选择,那么就需要选择的条件或者是选择的参数,选择条件或者是参数的来源通常又有几种:
  1. 来源于客户端,由Client来传入参数。上面的实例中的参数内容1跟2就是来自于客户端。
  2. 来源于配置文件,从配置文件获取用于判断的值。
  3. 来源于程序运行期的某个值,比如从缓存中获取某个运行期的值。

7.可配置的简单工厂实例

Api和Impl与实例6没有变化,只是Factory发生了变化,新的Factory1如下所示:
View Code

在Factory1的相同目录下创建一个配置文件,命名为:FactoryTest.properties。配置文件内容如下:

ImplClass=edu.sjtu.erplab.yanmo.simplefactory.Impl2

Client发生了一些小变换,不在需要传入参数,Client的代码实现如下:

View Code

 

 

 


本文转自xwdreamer博客园博客,原文链接:http://www.cnblogs.com/xwdreamer/archive/2011/11/07/2358220.html,如需转载请自行联系原作者

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
设计模式之二(简单工厂模式)
原文:设计模式之二(简单工厂模式) 前言   简单工厂模式根据提供的数据或者参数返回几个可能的类中的一个实例,说通俗点有点像面向对象编程中的多态性,一个基类,有多个派生类,在另外的调用程序中,根据参数来决定返回这个基类的哪个具体的派生类,返回值为基类类型,因为基类的引用可以指向派生类对象,而且这些所有的派生类都包含有基类的函数,也就是说派生类中有相同的函数,但是函数的实现可能不同。
606 0
23、Python与设计模式--设计原则
#一、六大设计原则 在法理学中,法律规则与法律原则都是法律规范的重要构成。但二者也会有些不同:法律规则是指采取一定的结构形式具体规定人们的法律权利、法律义务以及相应的法律后果的行为规范,内容比较明确,比如,交通法规中规定,禁止闯红灯;法律原则是指在一定法律体系中作为法律规则的指导思想,基本或本原的、综合的、稳定的原理和准则,内容上只包含“大方针”,而并未有具体规则,比如,如果车上有马上临产的孕妇
3045 0
21、Python与设计模式--备忘录模式
#一、游戏进度保存 打过游戏的朋友一定知道,大多数游戏都有保存进度的功能,如果一局游戏下来,忘保存了进度,那么下次只能从上次进度点开始重新打了。一般情况下,保存进度是要存在可持久化存储器上,本例中先以保存在内存中来模拟实现该场景的情形。 以模拟一个战斗角色为例。首先,创建游戏角色。 ``` class GameCharacter(): vitality = 0 atta
3272 0
自动调整速率的Actor设计模式
问题背景 与数据库或者存储系统交互是所有应用软件都必不可少的功能之一,akka开发的系统也不例外。但akka特殊的地方在于,会尽可能的将所有的功能都设计成异步的,以避免Actor阻塞,然而无法避免IO这类的阻塞操作。
972 0
Java描述设计模式(02):简单工厂模式
一、生活场景简介 1、引入场景 订餐流程简单描述 1)、食品抽象类,规定食品的基础属性操作 2)、鱼类,鸡肉类食品类扩展 3)、订餐流程类,根据食品名称,加工指定类型食品 4)、模拟客户端预定操作 2、源代码实现 1)、关系图谱 2)、代码实现 /** * 简单工厂模式引入场景 */ publ...
547 0
+关注
4716
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载