简单工厂 VS 工厂方法 VS 抽象工厂
说到设计模式。自然少不了简单工厂模式。工厂方法和抽象工厂这三姐妹。
它们之间可谓是各有所长,术业专攻啊!这篇博客来简单的梳理一下三者之间的关系。
那么工厂又是什么意思呢?结合三者的特点,我觉得能够这样理解:工厂能够看做一个特殊的类,在这个类中专门负责生产一系列产品(对象)的一个集合就能够成为工厂。
那么上述三种模式之间到底是如何的关系呢?各自又有什么优缺点呢?
一、简单工厂模式 VS 工厂方法模式
1、先来看一个简单工厂的一段代码:
public class OperationFactory
{
//声明一个方法用来实例化,但是为什么要用静态方法呢 public static Operation createOperate(string operate) {
Operation oper = null;
switch (operate )
{
//通过分支语句对子类进行实例化 case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper=new OperationMul ();
break;
case "/":
oper =new OperationDiv ();
break; }
return oper ;
}
通过代码我们能够看出。在简单工厂中,能够讲多种须要实例化的对象在一个分支结构中一次性的完毕。详细的选择要留给client去做。
比如:
oper= OperationFactory.createOperate("+");
那我们继续扩展。当我们想要在程序中添加一种算法符号,这时,我们必须对简单工厂中的分支语句进行改动。这样事实上就违背了设计模式中的开放——封闭原则。为了避免对内改动。我们再来看一下工厂方法模式。
2、工厂方法模式
核心思想:创建一个接口,子类去实现这个接口。同一时候,依据子类来决定到底要实例化哪个对象。
看一段代码:
interface IFactory //定义一个接口
{//非静态 Operation CreateOperation(); }
class AddFactory:IFactory
{
public Operation CreateOperation()
{
return new OperationAdd();//子类j决定详细对哪个子类进行实例化
}
} class SubFactory:IFactory
{
public Operation CreateOperation()
{
return new OperationSub();
}
}
其余代码类似略。
通过工厂方法模式。我们能够发现,假设如今再添加一个运算符的话。我们仅仅须要额外添加一个运算符子类和实现接口的子类就好了,而不用去对已经写好的类进行改动了。可见与简单工厂相比,工厂方法模式遵循了开放——封闭原则:即对外扩展,对内封闭。
另一个小小的差别:在简单工厂中用static声明方法为静态方法,而工厂方法中却未用到静态方法,原因是:在简单工厂中因为不须要子类进行继承,所以使用静态方法能够避免实例化。能够用类来直接调用方法。而在工厂方法中因为存在继承关系,所以不能使用静态方法
二、 工厂方法 VS 抽象工厂
我觉得事实上这二者本属于一类。
最基本的差别是:
工厂方法:涉及到的是仅仅需定义一个产品类和一个对象接口。能够派生出多个子类。
而抽象工厂:定义一系列即多个产品类和多个对象接口。分别派生出多个子类。
这里,不多做解释。
三、简单工厂 VS 抽象工厂
在抽象工厂中能够定义多个产品类和对象接口,但是,假设我们想要在此基础上多加一个产品,那么此时。须要添加的类就会非常多。同一时候还须要去更改涉及到的各个工厂。这事实上无形中就已经添加了代码的维护量。
对于编程来说又是一个不好的兆头。那么有什么办法能够改进它呢?事实上,简单工厂能够弥补这个缺陷。
举一个大话设计模式中的样例:创建数据库:SqlServer和Access两类,同一时候包括IUser和IDepartment两张表假设用抽象工厂方法来设计如图:
如图,假设此时,我们想要在添加一个项目表Project时。必须添加项目接口。SqlserverProject和AccessProject的类同一时候。还必须改动企业两个工厂,在两个工厂中添加实例化Project的项,造成代码维护量添加。
此时。假设我们把IFactory抽象工厂用一个DataAccess来取代。同一时候添加一个字符串变量,利用简单工厂来实例化字符串变量中所指定的数据库。
简单工厂方法的类图例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ3l5MTMw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="600" height="406" style="width:515px; height:338px">
当然,我们能够看出来。利用简单工厂方法。尽管修改相对少了。可是仍然违背了开放——封闭原则。由于在添加其它表时。仍须要修改DataAccess中的分支语句,所以。对于简单工厂和抽象工厂方法二者应该酌情使用。二者都有自己的长处和缺点,我们应该依据详细情况详细分析。
当然为了进一步改进。大话设计模式中还提到了利用“反射”和配置文件的技术。总之。设计模式是一门艺术,仅仅有更好。没有最好!
简单工厂 VS 工厂方法 VS 抽象工厂的更多相关文章
- 结合实例分析简单工厂模式&工厂方法模式&抽象工厂模式的区别
之前写过一篇关于工厂模式(Factory Pattern)的随笔,里面分析了简单工厂模式,但对于工厂方法和抽象工厂的分析较为简略.这里重新分析分析三者的区别,工厂模式是java设计模式中比较简单的一个 ...
- Java设计模式之简单工厂、工厂方法和抽象工厂
在前面的学习中(参见前面的博客),我们学到了很多OO原则: 封装变化 多用组合,少用继承 针对接口/超类编程,不针对实现编程 松耦合 开闭原则 让我们从一个简单的类开始,看看如何将之改造成符合OO原则 ...
- Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
- 设计模式(Python)-简单工厂,工厂方法和抽象工厂模式
本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...
- c# 设计模式 之:简单工厂、工厂方法、抽象工厂之小结、区别
很多时候,我发现这三种设计模式难以区分,常常会张冠李戴闹了笑话.很有必要深入总结一下三种设计模式的特点.相同之处和不同之处. 1 本质 三个设计模式名字中都含有“工厂”二字,其含义是使用工厂(一个或一 ...
- 设计模式3---工厂模式(Factory Pattern简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
- 简单工厂模式&工厂方法模式&抽象工厂模式的区别
之前写过一篇关于工厂模式(Factory Pattern)的随笔,里面分析了简单工厂模式,但对于工厂方法和抽象工厂的分析较为简略.这里重新分析分析三者的区别,工厂模式是java设计模式中比较简单的一个 ...
- Java设计模式—工厂方法模式&抽象工厂模式
工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式. 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在 ...
- headfirst设计模式(5)—工厂模式体系分析及抽象工厂模式
先编一个这么久不写的理由 上周我终于鼓起勇气翻开了headfirst设计模式这本书,看看自己下一个设计模式要写个啥,然后,我终于知道我为啥这么久都没写设计模式了,headfirst的这个抽象工厂模式, ...
随机推荐
- win 8.1 安装 SQL server 遇到的各种问题
企业版 SQL Server ed2k://|file|cn_sql_server_2012_enterprise_edition_x86_x64_dvd_813295.iso|5054384128| ...
- DAG上的动态规划
嵌套矩形问题(最长路及其字典序)有n个举行,选出尽量多的矩阵排成一排,使得除了最后一个之外,每一个矩形可以嵌套在下一个矩形内,并且打印 #include <iostream> #inclu ...
- org.springframework.core.Ordered接口
关于Ordered接口,用过的人可能知道,这里我谈下自己的理解.也希望各位大神能给予指点. 源码如下: /** * Interface that can be implemented by obje ...
- hdu 1387 Team Queue (链表)
题目大意: 不同的人在不同的队伍里,插入链表的时候假设这个链表里有他的队友,就把它放到最后一个队友的最后.假设没有队友,就把它放到整个链表的最后面. 出链表的时候把第一个人拿出来. 思路分析: 要模拟 ...
- UE4的编程C++创建一个FPSproject(两)角色网格、动画、HUD、子弹类
立即归还,本文将总结所有这些整理UE4有关角色的网络格.动画.子弹类HUD一个简单的实现. (五)角色加入网格 Character类为我们默认创建了一个SkeletaMeshComponent组件,所 ...
- 屏幕对象的F1/F4输入帮助功能
1.HELP-REQUST[FOR{LOW|HIGH}]字段的F1帮助 当选择SAP屏幕功能的制定字段按F1键时可以调关注用自定义的程序或者系统帮助文件,该功能通常称为F1帮助. TYPES:syst ...
- 【COCOS2DX-游戏开发之三三】TMX边界控制与小窗体内预览TMX
做一款像素游戏,须要确定地图的边界.保证人物的位置位于屏幕中央.到达地图左边界.地图位置不变.人向左走,到达右边界,地步位置不变,人向右走 如:地图左边.右边,上边空出的边界.还有下方留出操作butt ...
- Ubuntu升级到14.04
公司网络实在太翔了,搞了一天最终成功把ubuntu从13.10升级到了14.10,中间也越到了非常多问题,记录下来,以备參考. 13.10的时候想体验一把搜狗输入法,结果因为fcitx版本号太低,用了 ...
- 搜索:POJ2251&POJ1426&POJ3087&POJ2488
图的遍历也称为搜索,就是从图中某个顶点出发,沿着一些边遍历图中所有的顶点,且每个顶点仅被访问一次,遍历可采取两种不同的方式:深度优先搜索(DFS)和广度优先搜索(BFS). 1.DFS算法思想` 从顶 ...
- Windbg 32位版本和64位版本的选择
习惯了Vsiual Studio的兄弟们可能会因为先入为主的原因以为所有的调试器都应该像它那样,其实不然,当你安装Debugging Tools for Windows的时候,你将发现有两个系列的工具 ...