本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41142929

工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

从下面类图可以看出,抽象的创建者(Creator)提供了一个创建对象方法的接口,也称为“工厂方法”。其中,任何其它实现的方法,都可能使用该工厂方法制造出来的产品,但是只有子类真正实现这个工厂方法并创建产品。

其实,工厂方法是让子类决定要实例化的类是哪一个,但是这里的决定并不是说允许子类本身在运行时做决定,而是指在编写创建者(Creator)时,不需要知道实际创建的产品是哪一个,你选择的了使用哪个子类,那么自然就能决定实际创建的产品是什么。

当你直接地实例化一个类时,就是在依赖它的具体类。下面的类显示的是一个很依赖的面包店。

<span style="font-size:14px;">public class DependentBreadStore {

	public Bread createBread(String style, String type) {
		Bread Bread = null;
		if (style.equals("NY")) {
			if (type.equals("cheese")) {
				Bread = new BJStyleCheeseBread();
			} else if (type.equals("veggie")) {
				Bread = new BJStyleVeggieBread();
			} else if (type.equals("clam")) {
				Bread = new BJStyleClamBread();
			} else if (type.equals("pepperoni")) {
				Bread = new BJStylePepperoniBread();
			}
		} else if (style.equals("Chicago")) {
			if (type.equals("cheese")) {
				Bread = new ChicagoStyleCheeseBread();
			} else if (type.equals("veggie")) {
				Bread = new ChicagoStyleVeggieBread();
			} else if (type.equals("clam")) {
				Bread = new ChicagoStyleClamBread();
			} else if (type.equals("pepperoni")) {
				Bread = new ChicagoStylePepperoniBread();
			}
		} else {
			return null;
		}
		Bread.prepare();
		Bread.bake();
		Bread.cut();
		Bread.box();
		return Bread;
	}
}</span>

这里我们就会联想到OO设计原则中一个很重要的原则:依赖倒置原则——要依赖抽象,而不要依赖具体类。其实,这个原则和“针对接口编程,不针对实现编程”。该

原则说明了:不能够让高层组件依赖于低层组件,而

且,不管是高层组件还是低层组件,“两者”都应该依赖于抽象。就像上面包店一样,BreadStore是“高层组件”,而面包的实现是“低层组件”,“两者”都应该依赖于抽

象,而BreadStore依赖于这些具体的类了。(所谓高层

组件,指的是由其它低层组件定义其行为的类。BreadStore是高层组件,其行为是由面包定义的:BreadStore创建所有不同的面包对象,进行一系列操作;而面包本

身属于低层组件。

避免在OO设计中违反依赖倒置原则主要有:

(1)变量不可持有具体类的引用。(如果使用New,就会持有具体类的引用)

(2)不要让类派生自具体类。(如果派生自具体类,你就会依赖具体类。请派生自抽象(接口或者抽象类))

(3)不要覆盖类中已实现的方法。(如果覆盖基类已实现的方法,那么你的基类就不是一个真正适合被继承的抽象。基类已实现的方法,应该由所有子类共享)

通过上面的分析,可知,运用工厂方法可以避免对象之间的依赖关系,从而使代码变得更加灵活。另外,我们也了解了OO设计原则中的依赖倒置原则,并知道以后在什么样的情况下使用该原则。

注意:依赖倒置原则并不是随时都要遵循的原则。也有违反这一指导方针的地方。比如,有一个不像是会改变的类,那么在代码中直接实例化具体类也就没有什么大

碍的了。想想平时我们在程序中不假思索地就实例化字符串对象了?就没有违反这个原则!因为字符串的不可变的。所以,针对不同的场景,我们需要对其进行分

析,从而能够灵活的运行各种原则,而不是一成不变的。



设计模式之——工厂模式(B)的更多相关文章

  1. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  2. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. 3. 星际争霸之php设计模式--简单工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  4. iOS 设计模式之工厂模式

    iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...

  5. 设计模式之工厂模式(Factory)

    设计模式的工厂模式一共有三种:简单工厂模式,工厂模式,抽象工厂模式 简单工厂模式原理:只有一个工厂类,通过传参的形式确定所创建的产品对象种类 代码如下: #include <stdio.h> ...

  6. php设计模式:工厂模式

    php设计模式:工厂模式 意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂模式实现: 工厂模式中任何创建对象的工厂类都要实现这个接口,实现接口的方法体中都要实现接口中的方法,它声明 ...

  7. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  8. java 设计模式之工厂模式与反射的结合

    工厂模式: /**  * @author Rollen-Holt 设计模式之 工厂模式  */   interface fruit{     public abstract void eat(); } ...

  9. C#学习之设计模式:工厂模式

    最近研究一下设计模式中工厂模式的应用,在此记录如下: 什么是工厂模式? 工厂模式属于设计模式中的创造型设计模式的一种.它的主要作用是协助我们创建对象,为创建对象提供最佳的方式.减少代码中的耦合程度,方 ...

  10. [JS设计模式]:工厂模式(3)

    简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...

随机推荐

  1. Kali安装使用文泉驿字体

    安装文泉驿字体 Kali选择"简体中文"安装后,在终端等地方发现字体总有重叠,只要安装中文字体即可,这里推荐文泉驿字体.文泉驿是一个以开发开源.免费中文电子资源--如汉字字体.词库 ...

  2. ubuntu14.04 python2.7 安装配置OpenCV3.0

    环境:ubuntu14.04  python2.7 内容:安装并配置OpenCV3.0 今天按照OpenCV官网上的步骤装了OpenCV但是,装好之后python提示“No module named ...

  3. ucsc 文件格式说明

    链接附带的是ucsc各种格式文件的说明,以后遇到新类型的文件可以先来这里看看! https://www.genome.ucsc.edu/FAQ/FAQformat.html

  4. 无忧代理免费ip爬取(端口js加密)

    起因 为了训练爬虫技能(其实主要还是js技能-),翻了可能有反爬的网站挨个摧残,现在轮到这个网站了:http://www.data5u.com/free/index.shtml 解密过程 打开网站,在 ...

  5. ACM pie

    我的生日快到了,传统上我正在做馅饼.不只是一个馅饼,不,我有N个,各种口味和各种尺寸. 数量为F我的朋友会来到我的聚会,每个人都得到一个馅饼. 这应该是一块馅饼,而不是几个小块,因为看起来很乱.这一块 ...

  6. MongoDB Java

    MongoDB Java 环境配置 在Java程序中如果要使用MongoDB,你需要确保已经安装了Java环境及MongoDB JDBC 驱动. 你可以参考本站的Java教程来安装Java程序.现在让 ...

  7. Bootstrap3 表单-被支持的控件:输入框

    输入框包括大部分表单控件.文本输入域控件,还支持所有 HTML5 类型的输入控件: text.password.datetime.datetime-local.date.month.time.week ...

  8. linux系统性能监控--I/O利用率

    尽管整体的处理器速度. 内存大小以及 I/O执行速度在不断提高,但 I/O操作的吞吐率和延迟性能仍然要比等价的内存访问操作低多个数量级.另外,由于许多工作负荷都拥有重要的I/O组件,I/O处理很容易成 ...

  9. Hexo 简明教程

    概述 对于个人独立博客的搭建,或者一些产品网站的介绍我个人比较推崇直接用静态网站生成器来完成这个事情,对于,静态网页部署方便,浏览速度快. 以下为部分静态网站生成器简要列表: Ruby Jekyll ...

  10. PHP 文件下载 浅析

    无控制类型 avi文件 rar文件 mp4MP3图片等会被直接解析 核心代码 类型 长度 实现函数 优化 原始下载文件的名称 优化后的文件下载名称 总结 文件下载的功能对一个网站而言基本上是必备的了, ...