设计模式之——工厂模式(B)
本文是在学习中的总结,欢迎转载但请注明出处: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)的更多相关文章
- 设计模式——抽象工厂模式及java实现
		设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ... 
- 5. 星际争霸之php设计模式--抽象工厂模式
		题记==============================================================================本php设计模式专辑来源于博客(jymo ... 
- 3. 星际争霸之php设计模式--简单工厂模式
		题记==============================================================================本php设计模式专辑来源于博客(jymo ... 
- iOS 设计模式之工厂模式
		iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ... 
- 设计模式之工厂模式(Factory)
		设计模式的工厂模式一共有三种:简单工厂模式,工厂模式,抽象工厂模式 简单工厂模式原理:只有一个工厂类,通过传参的形式确定所创建的产品对象种类 代码如下: #include <stdio.h> ... 
- php设计模式:工厂模式
		php设计模式:工厂模式 意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类. 工厂模式实现: 工厂模式中任何创建对象的工厂类都要实现这个接口,实现接口的方法体中都要实现接口中的方法,它声明 ... 
- 浅析JAVA设计模式之工厂模式(一)
		1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ... 
- java 设计模式之工厂模式与反射的结合
		工厂模式: /** * @author Rollen-Holt 设计模式之 工厂模式 */ interface fruit{ public abstract void eat(); } ... 
- C#学习之设计模式:工厂模式
		最近研究一下设计模式中工厂模式的应用,在此记录如下: 什么是工厂模式? 工厂模式属于设计模式中的创造型设计模式的一种.它的主要作用是协助我们创建对象,为创建对象提供最佳的方式.减少代码中的耦合程度,方 ... 
- [JS设计模式]:工厂模式(3)
		简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ... 
随机推荐
- Cannot change version of project facet Dynamic Web Module to 2.5的解决
			步骤1 右键项目 点击Project Facets 修改里面的 Dynamic Web Module 成2.5 maven-update看下有没有解决 步骤2 没有就导入 <dependency ... 
- C# 获取当前屏幕DPI
			1.通过Graphics类获取 Graphics currentGraphics = Graphics.FromHwnd(new WindowInteropHelper(mainWindow).Han ... 
- 地址下拉框,需要js级联js
			function area() { _url = "/ashx/DropDownControl.ashx"; _swType = "GetArea"; _z = ... 
- 容器化现有ASP.NET MVC 5应用
			.NET Core的出现使得ASP.NET应用在Linux环境下使用变得更加普及.而配合上Docker容器,令ASP.NET应用的布署与管理也变得更加方便.在新的项目中运用ASP.NET Core无可 ... 
- 安卓高级 特效动画ExplosionField和 SmoothTransition
			本教程所有图片为github上的所无法正常访问请科学上网 SmoothTransition 展示效果 github:源码地址 使用方法 你能通过一行代码使用上面所有的动画 @Override prot ... 
- Bootstrap3 栅格系统-嵌套列
			为了使用内置的栅格系统将内容再次嵌套,可以通过添加一个新的 .row 元素和一系列 .col-sm-* 元素到已经存在的 .col-sm-* 元素内.被嵌套的行(row)所包含的列(column)的个 ... 
- JFinal中使用QuartzPlugin报ClassCastException解决方法
			JDK1.8中泛型反射修改对旧版本的影响 本文地址:http://blog.csdn.net/sushengmiyan 本文作者:苏生米沿 问题复现环境: JDK1.8 JFinal1.9 quart ... 
- Dynamics CRM2016   Web API之获取查找字段的text及选项集的text
			本篇再来介绍个web api的功能,关于lookup的text这里只是略带,因为有expand,现有的web api就能实现,主要提的是选项集的text,我们通过基本的查询api查出来的字段值只带有v ... 
- 有无序的实数列V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间。
			int findMaxDifBt2Nums(int* arr, int len) { int maxItem = arr[0], minItem = arr[0]; for (int i = 1; i ... 
- 详解EBS接口开发之供应商导入(补充)--错误信息处理
			check reject details on records of AP_SUPPLIER_INT SELECT s.parent_table,s.reject_lookup_code,S.LAST ... 
