Keywords: Factory Pattern, Design Pattern

在网上经常会看到有关Factory Pattern的文章, 今天我也在blog上发表一下对一个非常简单Factory pattern的见解.

Factory模式其实就是为了封装系统的变化点, 将变化点集中在一起, 一旦这些变化点真的发生变化时, 只要修改一处代码就可以了.

一图胜万言, figure1是表述这样的一个应用: (1)用户选择一个压缩文件, 然后解压. (2)用户选择一个压缩文件, 然后将它转换成自解压格式. 面对这样的需求, 我们该做什么样的结构设计呢?

figure1

初步设计是: 目前流行的压缩格式有zip和rar等. 我们会抽象一个压缩格式处理器这样的基类(命名为CompressBase), 不同压缩格式的解压和压缩算法不同, 所以我们又会设计出CompressBase的几个派生类, 比如ZipCompress和RarCompress. 用户可能会选择一个zip文件需要我们处理, 也可能选择一个rar文件. 在程序中, 到底要实例化哪个派生类呢? 一个简单的方法是, 通过文件的扩展名, 作为判断的依据. 最开始, 实现Scenario A中的代码为:

public void Decompress(string fileName)

 {

     CompressBase compressObj=null ;

string fileExtenstion= FileHelper.GetExtension(fileName) ;

switch (fileExtenstion)

     {

case "zip":

             {

                 compressObj= new ZipCompress(fileName);

break ;

             }

case "rar"

             {

                 compressObj= new ZipCompress(fileName);

break ;

             }

default:

             {

return  ;

             }

     }

//uncompress the file 

     compressObj.Decompress() ;

 }

同样, 在实现Scenario B的MakeSelfExe()也和上面代码相似. 这样做有什么问题呢? 问题之一, 如果系统要增加对7zip格式的支持, 需要修改所有生成CompressBase对象的地方. 问题之二, 如果我们不采用通过文件扩展名来判断压缩格式的方法, 而是采用更好的算法时, 也需要在程序中到处修改生成CompressBase对象的代码.

较好的设计方案是: 设计一个Factory类, 它具有一个静态的CreateInstance(string fileName), 该方法封装了生成CompressBase类的算法. 刚开始可以继续采用根据扩展名来生成不同的CompressBase子类. 在要生成 即使将来更新算法或增加新的压缩格式, 也只需要更新CreateInstance().

适用性:

(1) 如果可以确定一个系统中, 仅有Scenario A这个场合, 不会有其他类似的功能, 就没有必要使用这种模式.

(2) 对于Scenario A, 这个场景的入口是唯一的. 如果操作的入口和派生类的个数一样的话, 也没有必要使用这种模式, 比如在画图程序中, 虽然Triangle类和Rectangle类都是Shape类的子类, 但画图程序的工具面板上有画三角和矩形两个ToolButton, 也没有必要再创建一个Factory类来负责生成派生类对象.

转载于:https://www.cnblogs.com/harrychinese/archive/2011/08/28/2156481.html

Understand one Simple Factory Pattern相关推荐

  1. Net设计模式之简单工厂模式(Simple Factory Pattern)

    一.简单工厂模式简介(Bref Introduction)        简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实 ...

  2. 设计模式(1):简单工厂模式(Simple Factory Pattern)

    1. 从一个简单的例子开始 在众多的设计原则中,有一条原则是这么说的:要针对接口编程,不要针对实现编程. 针对接口编程的话,可以使用不同的实现类来创建这个对象.比如需要一个List: List< ...

  3. 简单工厂模式(Simple Factory Pattern)

    前言 学习难度:★★☆☆☆ 使用频率:★★★☆☆ 学会它. 开始吧 模式名称 中文:简单工厂模式 English: Simple Factory Pattern 含义:简单工厂模式专门定义一个类来负责 ...

  4. 设计模式之简单工厂模式(Simple Factory Pattern)

    什么是简单工厂模式? 以下内容来自 ChatCPT 的回答: 简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,其主要目的是将对象的创建过程封装在一个单独的类中,以便于 ...

  5. 简单工厂模式:Simple Factory Pattern(转自阿良.NET)

    简单工厂(Simple Factory)模式 Simple Factory模式根据提供给它的数据,返回几个可能类中的一个类的实例.通常它返回的类都有一个公共的父类和公共的方法. Simple Fact ...

  6. C#设计模式(4)-Simple Factory Pattern

    工厂模式专门负责将大量有共同接口的类实例化.工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类.工厂模式有以下几种形态: 简单工厂(Simple Factory)模式 工厂方法(F ...

  7. 秒懂设计模式之简单工厂模式(Simple Factory Pattern)

    版权申明]非商业目的可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/86634864 出自:shusheng007 设计模式 ...

  8. 进阶学习(3.1) Simple Factory Pattern 简单工厂模式

    1,设计原则 工厂和工厂对象尽量都是高内聚的, 例如网上最多的例子, 支付案例, 一个支付工厂, 可以创建微信支付对象, 也可以创建支付宝支付对象, 他们都是属于支付 这样方便别人理解, 和代码重构, ...

  9. 【设计模式 01】简单工厂模式(Simple factory pattern)

    简单工厂模式 可以根据参数的不同返回不同类的实例 参考: CSDN|简单工厂模式 简单工厂通过传给工厂类的参数的不同,返回不同的对象,包括三部分组成: 具体的"产品" 工厂类(实例 ...

最新文章

  1. cluster maintain manager Software群集管理软件
  2. ListView 常用属性
  3. 读书笔记 《Perl语言入门》 Day 1
  4. 16款优秀的Vue UI组件库推荐
  5. Gym101128F:Landscaping
  6. ViewRoot,DecorView,MeasureSpec和View的工作原理——Android开发艺术探索笔记
  7. RowVersion字段从SqlServer到PostgreSQL的迁移
  8. 职业技术人士学习捷径最快的网站
  9. 阿里高级技术专家箫逸:如何画好一张架构图?
  10. python坐标定位_Python_元素定位浏览器坐标定位
  11. 关闭迅雷“XLServicePlatform”服务 防止导致Win8假死
  12. Python build-in数据类型之字符串str (一)
  13. 【云存储】大容量网盘的介绍与选择
  14. Qt 之 打开pdf文件
  15. 使用Substrate开发区块链存证dApp
  16. Unity插入视频音频
  17. 【WPS在线文档转换】
  18. 2022-2028中国聚合物增材制造系统市场现状研究分析与发展前景预测报告
  19. 隐藏账户的排除、D盾的使用
  20. [幻灯片]软件需求设计方法学全程实例剖析-01-概述

热门文章

  1. Hive学习笔记 —— Hive的管理
  2. 单链表倒数第K个节点的查找和显示
  3. (转载)简单linux C++内存池
  4. Receiver ED、Link quality indicator (LQI)、Clear channel assessment (CCA)究竟是什么?802.15.4标准
  5. 哭了,复现TensorFlow版本MAE的shuffle和reshuffle
  6. 字符串去掉两端的引号_Python3.7知其然知其所以然-第六章 字符串
  7. 赋值运算符||位运算符||三元运算符
  8. java的知识点23——泛型Generics、Collection接口、List特点和常用方法、 ArrayList特点和底层实现
  9. 矩阵乘法的四种理解方式
  10. matlab条件判断配合输出