设计模式--简单工厂VS工厂VS抽象工厂
前几天我一直在准备大学毕业生,始终绑起来,如今,终于有时间去学习设计模式。我们研究今天的话题是植物三口之家的设计模式的控制--简单工厂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抽象工厂的更多相关文章
- Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
- java之设计模式工厂三兄弟之抽象工厂模式
[学习难度:★★★★☆,使用频率:★★★★★] 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工 ...
- PHP简单工厂模式、工厂方法模式和抽象工厂模式比较
PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法.您可以使用工厂类创建对象,而不直接使用 new.这样,如果您想要更改所创建的对象类型,只需更改该工厂即可.使用该工厂的所有代码会自动 ...
- PHP简单工厂模式、工厂方法模式和抽象工厂模式
PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法.您可以使用工厂类创建对象,而不直接使用 new.这样,如果您想要更改所创建的对象类型,只需更改该工厂即可.使用该工厂的所有代码会自动 ...
- JAVA中的工厂方法模式和抽象工厂模式
工厂方法模式: 定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类.类型:创建类模式类图: 类图知识点:1.类图分为三部分,依次是类名.属性.方法2.以& ...
- 【design pattern】工厂方法模式和抽象工厂模式
前言 设计模式分为三大类: 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式: 结构型模式:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式: 行为型模式 ...
- Java开发中的23中设计模式详解(一)工厂方法模式和抽象工厂模式
一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...
- iOS常用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)
1. 简单工厂模式 如何理解简单工厂,工厂方法, 抽象工厂三种设计模式? 简单工厂方法包含:父类拥有共同基础接口,具体子类实现子类特殊功能,工厂类根据参数区分创建不同子类实例.该场景对应的UML图如下 ...
- iOS经常使用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)
1. 简单工厂模式 怎样理解简单工厂,工厂方法. 抽象工厂三种设计模式? 简单工厂的生活场景.卖早点的小摊贩.他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂.它生产包子,馒头,地沟油烙的煎饼. ...
随机推荐
- windows phone 7 定位(获取经纬度),然后找到经纬度所在的位置(城市信息)
原文:windows phone 7 定位(获取经纬度),然后找到经纬度所在的位置(城市信息) 前几天做项目用到, 代码贴给大家. /// <summary> /// 获取当前位置的经纬度 ...
- windows phone 页面导航(6)
原文:windows phone 页面导航(6) 页面导航的例子我们使用的是两个页面,从第一个页面(MainPage)导航到第二个页面(SecondPage),然后可以从第二个页面导航到第一个页面 , ...
- Web测试基于实际测试的功能测试点总结--转载
文章来源:http://www.51testing.com/html/99/n-854599.html 好文章就该记录一下\(^o^)/~ 一.页面链接检查:测试每一个链接是否都有对应的页面,并且页面 ...
- 使用Socket沟通
当两台电脑TCP/IP协议进行通讯.平时Socket对象来表示该通信接口的两端,并通过Socket生产I/O流进行网络通信. 其中ServerSocket对象可以接收从连接的其他通信实体的请求.这个目 ...
- Custom Media Player in WPF (Part 1)
First of all I would like to welcome everyone to my new blog and wish you all a happy new year… Thro ...
- 从零開始学android<RelativeLayout相对布局.十六.>
相对布局管理器指的是參考某一其它控件进行摆放,能够通过控制,将组件摆放在一个指定參考组件的上.下.左.右等位置,这些能够直接通过各个组件提供的属性完毕. 以下介绍一下各个方法的基本使用 No. 属性名 ...
- 72_leetcode_Construct Binary Tree from Preorder and Inorder Traversal
Given preorder and inorder traversal of a tree, construct the binary tree. Note: You may assume that ...
- PKI系统深入的介绍
公钥基础设施(Public Key Infrastructure,缩写PKI)的基础与核心.是电子商务安全实施的基本保障.因此.对PKI技术的研究和开发成为眼下信息安全领域的热点. 本文对PKI技术进 ...
- 【原创】leetCodeOj --- Interleaving String 解题报告
题目地址: https://oj.leetcode.com/problems/interleaving-string/ 题目内容: Given s1, s2, s3, find whether s3 ...
- hdu1394--Minimum Inversion Number(线段树求逆序数,纯为练习)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...