`
chjavach
  • 浏览: 464660 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

研磨设计模式之简单工厂模式-1

阅读更多

 

 继续研磨设计模式,来个简单的

 

简单工厂


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


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的基础知识里面就是这么学的,难道这有什么问题吗?
        请仔细看位于客户端的下面这句话:

	Api api = new Impl();

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

 

        你会发现在客户端调用的时候,客户端不但知道了接口,同时还知道了具体的实现就是Impl。而接口的思想是“封装隔离”,而Impl这个实现类,应该是被接口Api封装并同客户端隔离开的,也就是说,客户端根本就不应该知道具体的实现类是Impl。
        有朋友说,那好,我就把Impl从客户端拿掉,让Api真正的对实现进行“封装隔离”,然后我们还是面向接口来编程。可是,新的问题出现了,当他把“new Impl()”去掉过后,发现他无法得到Api接口对象了,怎么办呢?
        把这个问题描述一下:在Java编程中,出现只知接口而不知实现,该怎么办?
        就像现在的Client,它知道要使用Api接口,但是不知由谁实现,也不知道如何实现,从而得不到接口对象,就无法使用接口,该怎么办呢?

 

 

 

《研磨设计模式》一书已经上市,卓越网销售链接:
http://www.amazon.cn/%E7%A0%94%E7%A3%A8%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E9%99%88%E8%87%A3/dp/B004G8P90S/ref=sr_1_1?ie=UTF8&qid=1295358211&sr=8-1

 

也可以直接在卓越网上搜索《研磨设计模式》

 

当当网的销售链接:http://product.dangdang.com/product.aspx?product_id=20994349&ref=search-0-mix

 

 

希望朋友们能给本书评评分,写点评论,多谢大家的支持!

 

 未完待续  

 

  • 大小: 21.9 KB
  • 大小: 5.1 KB
  • 大小: 2.8 KB
  • 大小: 3.8 KB
分享到:
评论
17 楼 10w10y10n 2011-09-15  
楼主的文章非常好,看了之后买了本书,受益很多啊。 希望楼主能多写一些文章,不仅仅限于设计模式。拜谢!!!
16 楼 happenZheng 2010-12-29  
醍醐灌顶!!!
继续紧跟!
15 楼 mingyang2013 2010-11-20  
houxinyou 写道
把这个问题描述一下:在Java编程中,出现只知接口而不知实现,该怎么办?

这个问题的回答在哪儿呢?是在你的书里,还是在以后的博文里,还是我自己去想?我学设计模式就这里不明白,你问完了不回答,我看了有啥意思?


哥们,楼主这是个设问,而你把他当成了纯粹的疑问。楼主这样的写作风格很好,逐步深入,并给我们留下了思考的空间。请不要抱怨。
14 楼 chjavach 2010-11-18  
houxinyou 写道
apple307878412 写道
houxinyou 写道
把这个问题描述一下:在Java编程中,出现只知接口而不知实现,该怎么办?

这个问题的回答在哪儿呢?是在你的书里,还是在以后的博文里,还是我自己去想?我学设计模式就这里不明白,你问完了不回答,我看了有啥意思?

这个spring中的IOC就能实现

我也知道spring中的IOC就能实现,但是我关心的怎么去实现,也就是spring中的IOC的原理,在我不用spring中的IOC的时候,我自己应该怎么处理?


向后面看,哈哈
13 楼 houxinyou 2010-11-14  
apple307878412 写道
houxinyou 写道
把这个问题描述一下:在Java编程中,出现只知接口而不知实现,该怎么办?

这个问题的回答在哪儿呢?是在你的书里,还是在以后的博文里,还是我自己去想?我学设计模式就这里不明白,你问完了不回答,我看了有啥意思?

这个spring中的IOC就能实现

我也知道spring中的IOC就能实现,但是我关心的怎么去实现,也就是spring中的IOC的原理,在我不用spring中的IOC的时候,我自己应该怎么处理?
12 楼 apple307878412 2010-11-13  
houxinyou 写道
把这个问题描述一下:在Java编程中,出现只知接口而不知实现,该怎么办?

这个问题的回答在哪儿呢?是在你的书里,还是在以后的博文里,还是我自己去想?我学设计模式就这里不明白,你问完了不回答,我看了有啥意思?

这个spring中的IOC就能实现
11 楼 dolwenjian 2010-11-12  
看了 博客所有设计模式博文  very good!! 
一直觉得自己 这方面比较欠缺, 哎 野路子出身。。。
10 楼 chjavach 2010-11-04  
houxinyou 写道
把这个问题描述一下:在Java编程中,出现只知接口而不知实现,该怎么办?

这个问题的回答在哪儿呢?是在你的书里,还是在以后的博文里,还是我自己去想?我学设计模式就这里不明白,你问完了不回答,我看了有啥意思?


后续博文有
9 楼 浪客剑心 2010-11-04  
呵呵 期待下文!
8 楼 wkwj520 2010-11-04  
原来一直都没有想到过这种问题,今天看了下还是觉得楼主说的有点道理!楼主这种方法也蛮好,先让我们自己想,然后再给出你的见解,相信到时候的理解比你在这里直白地说出来更深了...
7 楼 狂放不羁 2010-11-03  
这也是IOC的一个好处
6 楼 houxinyou 2010-11-03  
把这个问题描述一下:在Java编程中,出现只知接口而不知实现,该怎么办?

这个问题的回答在哪儿呢?是在你的书里,还是在以后的博文里,还是我自己去想?我学设计模式就这里不明白,你问完了不回答,我看了有啥意思?
5 楼 ilovehome 2010-11-03  
好文啊
4 楼 chjavach 2010-11-02  
hankai_hk 写道
哈哈...88其实也不贵,88买了808值啊,学到东东就更值了。物件都在上涨,赶快上架,先买一本。66不是会员价吗?


应该是注册就是会员了,呵呵,现在网购图书不都有折扣嘛
3 楼 hankai_hk 2010-11-02  
哈哈...88其实也不贵,88买了808值啊,学到东东就更值了。物件都在上涨,赶快上架,先买一本。66不是会员价吗?
2 楼 chjavach 2010-11-02  
hankai_hk 写道
已经预定一本 了,已上市先买一本。88也不便宜啊!确实不错,好书一本


呵呵,互动不是折扣嘛,折扣后66,大大节省嘛。808页的内容呢,88还好吧,不算贵,呵呵。
1 楼 hankai_hk 2010-11-02  
已经预定一本 了,已上市先买一本。88也不便宜啊!确实不错,好书一本

相关推荐

    研磨设计模式-配套源代码 UTF-8格式

    《研磨设计模式》是一本深入探讨软件设计原则与实践的经典书籍,其配套源代码提供了丰富的实例,帮助读者更好地理解和应用各种设计模式。这个UTF-8格式的压缩包包含了书中介绍的各种设计模式的实现,是学习和研究...

    研磨设计模式源码

    《研磨设计模式源码》是一份非常宝贵的资源,它提供了设计模式的实践代码,帮助开发者深入理解并应用这些模式。设计模式是软件工程中经过长期实践总结出来的一套通用解决方案,它们描述了在特定场景下如何解决常见...

    研磨设计模式(完整带书签).part2.pdf

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式之工厂方法模式.

    《研磨设计模式之工厂方法模式》是一本深入解析Java设计模式的专业书籍,特别是对工厂方法模式进行了详尽的探讨。设计模式是软件工程中的一种最佳实践,它们是解决常见问题的经验总结,使得代码更加可读、可维护和可...

    研磨设计模式PDF

    《研磨设计模式》这本书是陈臣和王斌两位作者合作的成果,专注于讲解软件设计中的模式应用。设计模式是软件工程中的一种最佳实践,它总结了在特定上下文中解决问题的常见方法,使得开发者可以复用这些解决方案,提高...

    研磨设计模式-配套源代码

    "研磨设计模式-配套源代码"很显然是一份与学习和理解设计模式相关的资源,其中包含了实际的编程示例。这份压缩包可能包括了多种常见设计模式的实现,如单例模式、工厂模式、观察者模式、装饰器模式等,通过源代码的...

    研磨设计模式--chjavach的博客文章

    研磨设计模式的过程是持续学习和实践的过程,chjavach的博客文章提供了深入探讨这些模式的宝贵资源,值得我们仔细阅读和学习。通过深入理解和运用这些设计模式,可以提升个人的编程技巧,同时也为团队合作和项目维护...

    研磨设计模式-配套源代码.7z

    《研磨设计模式》是一本深入探讨软件设计模式的书籍,其配套源代码包含了许多经典设计模式的实际应用示例。这些源代码可以帮助读者更直观地理解设计模式的原理和使用方法,进一步提升软件开发能力。 设计模式是软件...

    研磨设计模式[书签]

    《研磨设计模式》是由陈臣和王斌合著,由清华大学出版社出版的一本深入探讨设计模式的专业书籍。设计模式是软件工程中的一个重要概念,它代表了在特定上下文中解决问题的常见方法,经过时间和实践的验证,具有很高的...

    研磨设计模式全部源代码

    1. 工厂模式:这是最简单的创建型设计模式,它提供了一种创建对象的最佳方式。工厂模式通过创建一个工厂类来生产特定类型的对象,而不是直接实例化对象,这样可以使代码更具灵活性。 2. 单例模式:这种模式确保一个...

    研磨设计模式之 工厂方法模式.doc

    研磨设计模式之 工厂方法模式.doc

    研磨设计模式-配套源代码.rar

    《研磨设计模式》是一本深入探讨软件设计模式的书籍,配套源代码是作者为了帮助读者更好地理解和应用书中介绍的设计模式而提供的实践示例。设计模式是软件开发中经过实践检验的、解决常见问题的模板,它为软件设计...

    研磨设计模式博文集

    1. **创建型模式**:这类模式主要关注对象的创建过程,如单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。它们提供了...

    研磨设计模式 源代码

    《研磨设计模式》是一本深入探讨软件设计模式的经典书籍,源代码包含了书中所讲解的各种设计模式的实际应用示例。设计模式是软件工程中的重要概念,它们是经过反复验证、在特定情境下解决常见问题的有效解决方案。...

    研磨设计模式.rar

    《研磨设计模式》这本书是软件开发领域中的经典之作,主要关注的是面向对象设计中的设计模式。设计模式是在特定上下文中解决常见问题的最佳实践,它为开发者提供了在类似情况下重复使用解决方案的模板,有助于提高...

    研磨设计模式讲课PPT

    研磨设计模式是一本深入探讨软件设计原则与实践的书籍,其讲课PPT为我们提供了丰富的设计模式知识。设计模式是软件工程中经过实践验证的、解决常见问题的模板,是经验丰富的开发人员智慧的结晶。这些模式可以帮助...

    研磨设计模式(完整带书签).part1.pdf

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式 演示源代码

    "研磨设计模式 演示源代码"这个资源包含了对设计模式的详细解释和实例分析,旨在帮助学习者深入理解和应用这些模式。 1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。在资源管理、缓存或者线程池...

    研磨设计模式-part2

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

    研磨设计模式-part4

    《研磨设计模式》完整覆盖GoF讲述的23个设计模式并加以细细研磨。初级内容从基本讲起,包括每个模式的定义、功能、思路、结构、基本实现、运行调用顺序、基本应用示例等,让读者能系统、完整、准确地掌握每个模式,...

Global site tag (gtag.js) - Google Analytics