前几天我一直在准备大学毕业生,始终绑起来,如今,终于有时间去学习设计模式。我们研究今天的话题是植物三口之家的设计模式的控制--简单工厂VS工厂VS抽象工厂。

经过细心推敲,我们不难得出:工厂模式是简单工厂的升级版,抽象工厂是工厂模式的升级版,简单工厂+抽象工厂是抽象工厂的升级版。知道了它们之间的宏观关系,以下我带它们从一次次蜕变了解它们为什么是这种关系。

我们最原始的代码思维是把所有的实现都放在一个类中。功能尽管是实现了,但耦合性非常高。非常不方便维护,好比活字印刷术之前的印刷,一个地方须要改动,则所有内容都须要推倒重来。

简单工厂攻克了上述问题,简单工厂中的工厂类包括了必要的逻辑推断。依据client的选择条件动态实例化相关的类,其思路例如以下图所看到的。但它有个致命的缺点:违反开放-封闭原则。比方当须要创建“开方类”的时候,须要改动“简单工厂类”中的方法。

工厂模式弥补简单工厂的不足,将一个类的实例化延迟到其子类。

工厂方法把简单工厂的内部逻辑推断移到了client代码来进行,假设想要加入功能。仅仅需改动client就可以。

比方加入“开方类”,仅仅需在运算类以下加入一个“开方类”,在抽象工厂以下加入一个“开方工厂”就可以。保证了开方-封闭原则。其思路例如以下图所看到的。

但它的缺点是每加一个运算类。就须要加一个运算工厂的类,添加了额外的开发量。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXV3ZW56aGU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

抽象工厂弥补了工厂模式的不足,抽象工厂提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们详细的类。比方按工厂模式的思想,SqlserverUser类、AccessUser类、SqlDepartment类、AccessDepartment类须要四个工厂来创建。而抽象工厂对它们公共的部分进行了抽象,仅仅需两个工厂就能完毕相同需求,其思路例如以下图所看到的。它的还有一个长处是详细的创建实例过程与client分离,client通过抽象接口操纵实例。它的缺点是假设需求来自添加功能。比方我们要添加项目表Project,则至少须要添加三个类IProject、SqlserverProject、AccessProject。还须要更改IFactory、SqlserverFactory、AccessFactory才干够全然实现。要改动三个类,过程有点糟糕。

简单工厂+抽象工厂弥补了抽象工厂的不足,用DataAccess类取代IFactory、SqlserverFactory、AccessFactory三个工厂类。在DataAccess类中,用反射+配置文件实现数据訪问,核心方法:Assembly.Load(“程序集名称”).CreateInstance(“命名空间.类名称”)。依据配置文件的keyword,动态创建类。其其思路例如以下图所看到的。

事实上每种设计模式都有它的优缺点,我们必须在学习它们长处的同一时候也要考虑它们的缺点,这样才干在学习过程中游刃有余。

但做人就不一样了,这里能够引用米老师的一句话: “假设仅仅是追寻一个人的缺点,慢慢别人的缺点也会成为自己的缺点。可是假设总是看别人的长处,慢慢别人的长处也成为自己的长处。”

我希望我的解释能帮助你成长。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

设计模式--简单工厂VS工厂VS抽象工厂的更多相关文章

  1. Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)

    Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...

  2. python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)

    十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...

  3. java之设计模式工厂三兄弟之抽象工厂模式

    [学习难度:★★★★☆,使用频率:★★★★★]  工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工 ...

  4. PHP简单工厂模式、工厂方法模式和抽象工厂模式比较

    PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法.您可以使用工厂类创建对象,而不直接使用 new.这样,如果您想要更改所创建的对象类型,只需更改该工厂即可.使用该工厂的所有代码会自动 ...

  5. PHP简单工厂模式、工厂方法模式和抽象工厂模式

    PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法.您可以使用工厂类创建对象,而不直接使用 new.这样,如果您想要更改所创建的对象类型,只需更改该工厂即可.使用该工厂的所有代码会自动 ...

  6. JAVA中的工厂方法模式和抽象工厂模式

    工厂方法模式: 定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类.类型:创建类模式类图: 类图知识点:1.类图分为三部分,依次是类名.属性.方法2.以& ...

  7. 【design pattern】工厂方法模式和抽象工厂模式

    前言 设计模式分为三大类: 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式: 结构型模式:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式: 行为型模式 ...

  8. Java开发中的23中设计模式详解(一)工厂方法模式和抽象工厂模式

    一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...

  9. iOS常用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

    1. 简单工厂模式 如何理解简单工厂,工厂方法, 抽象工厂三种设计模式? 简单工厂方法包含:父类拥有共同基础接口,具体子类实现子类特殊功能,工厂类根据参数区分创建不同子类实例.该场景对应的UML图如下 ...

  10. iOS经常使用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

    1. 简单工厂模式 怎样理解简单工厂,工厂方法. 抽象工厂三种设计模式? 简单工厂的生活场景.卖早点的小摊贩.他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂.它生产包子,馒头,地沟油烙的煎饼. ...

随机推荐

  1. 怎样在C++中获得完整的类型名称

    Wrote by mutouyun. (http://darkc.at/cxx-get-the-name-of-the-given-type/) 地球人都知道C++里有一个typeid操作符能够用来获 ...

  2. Ubuntu Linux 永山(mount)分

    在一般情况下,我们想安装一个分区解决方案是使用mount命令,因为我想/dev/sda3安装/media/aborn/data通过使用下面的命令 sudo mount /dev/sda3 /media ...

  3. quick-cocos2d-x游戏开发【7】——scheduler 定时器

    定时器用的地方还是比較多的,游戏中的逻辑推断非常多都是採用每帧运行.quick对于schedule的封装在scheduler这个lua文件里.假设是第一次接触quick的话,可能依照官方的api来写一 ...

  4. Java使用LdAP获取AD域用户

    随着我们的习大大上台后,国家在网络信息安全方面就有了非常明显的改变!所以如今好多做网络信息安全产品的公司和须要网络信息安全的公司都会提到用AD域server来验证,这里就简单的研究了一下! 先简单的讲 ...

  5. WebService(2)-XML系列之Java和Xml之间相互转换

    源代码下载:链接:http://pan.baidu.com/s/1ntL1a7R password: rwp1 本文主要讲述:使用jaxb完毕对象和xml之间的转换 TestJava2xml.java ...

  6. Hbase0.96源码之HMaster(二)Hmaster主要循环becomeActiveMaster

    1,Hmaster主循环主要这里主要有: 1,1 becomeActiveMaster(startupStatus); 1.2 finishInitialization 1.3 loop() beco ...

  7. 源码安装apache及配置转发

    一.    安装Apache a)    解压:tar -xvf httpd-*; b)    ./configure --prefix=/usr/oracle/apache CC="gcc ...

  8. C,C++中的static

    在C和C++中,static都有两种基本的含义,并且这两种含义经常是互相有冲突的: 1) 在固定的地址上分配,也就是说对象是在一个特殊的静态数据区上创建的,而不是每次 函数调用时在堆栈上产生的.这也是 ...

  9. hdu1052 Tian Ji -- The Horse Racing 馋

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:pid=1052">http://acm.hdu.edu.cn/showproblem.php ...

  10. 最简单的视频编码器:基于libx265(编码YUV为H.265)

    ===================================================== 最简单的视频编码器系列文章列表: 最简单的视频编码器:编译 最简单的视频编码器:基于libx ...