设计模式之——工厂模式(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)
简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...
随机推荐
- 值得珍藏的HTTP协议详解
转自:http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html 引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式 ...
- 一口一口吃掉Hibernate(六)——多对多关联映射
今天来说说hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种. 首先举个多对多关联例子:用户User和角色Role,一个用户可以属于多个角色,一个角色可以有多个用户.这就 ...
- 重写轮子之 ID3
这是半成品, 已完成了 fit() 部分, 形成了包含一棵完整树的 node 对象. 后续工作是需解析该 node对象, 完成 predict() 工作. # !/usr/bin/python # - ...
- python实现编写windows服务
使用python编写windows服务 最近测试服务器上经常发生磁盘空间不足,每次手动清除比较麻烦,所以写个windows服务定时清理下.中间也遇到过几个坑,一起记录下来. 1.python实现win ...
- ionic tab页面跳转
要使用到Tabs,现将Tabs导入 import { NavController, ModalController, Tabs } from 'ionic-angular'; 把要选择的Tabs页面的 ...
- Go 语言环境安装
Go 语言支持以下系统: Linux FreeBSD Mac OS X(也称为 Darwin) Window 安装包下载地址为:https://golang.org/dl/. 各个系统对应的包名: 操 ...
- opencv之人脸识别
最近在做一个类似于智能广告投放的项目,简单思路是利用opencv获取摄像头图像,然后调用接口或利用其他一些离线模型进行人脸属性识别,进而投放广告.本篇先简单介绍利用opecv进行人脸识别. # -*- ...
- android 小项目------黑名单app
周一的时候,同事在群里问到了黑名单功能,他说网上都没有找到一个完整的,记得谁说过一句,当都没有做过的时候,这就是机会.这几天公司事比较多,只能晚上抽时间写写,直到今天才完整的做出来. 具体效果的话大家 ...
- springMVC源码分析--SimpleUrlHandlerMapping(四)
上一篇博客springMVC源码分析--AbstractUrlHandlerMapping(三)中我们介绍了AbstractUrlHandlerMapping,主要介绍了一个handlerMap的ur ...
- sum,filter和map参数里面的玄机
首先是sum函数. 最常见的用法似乎是: >>> sum([1,2,3]) 6 但其实这是默认首个元素是数字0.我们可以指定其他数字: >>> sum([1,2,3 ...