4 方案的改进

Sunny软件公司开发人员发现在创建具体Chart对象时,每更换一个Chart对象都需要修改客户端代码中静态工厂方法的参数,客户端代码将要重新编译,这对于客户端而言,违反了“开闭原则”,有没有一种方法能够在不修改客户端代码的前提下更换具体产品对象呢?答案是肯定的,下面将介绍一种常用的实现方式。

我们可以将静态工厂方法的参数存储在XML或properties格式的配置文件中,如下config.xml所示:

[html]  view plain copy
  1. <?xml version="1.0"?>
  2. <config>
  3. <chartType>histogram</chartType>
  4. </config>

再通过一个工具类XMLUtil来读取配置文件中的字符串参数,XMLUtil类的代码如下所示:

[java]  view plain copy
  1. import javax.xml.parsers.*;
  2. import org.w3c.dom.*;
  3. import org.xml.sax.SAXException;
  4. import java.io.*;
  5. public class XMLUtil {
  6. //该方法用于从XML配置文件中提取图表类型,并返回类型名
  7. public static String getChartType() {
  8. try {
  9. //创建文档对象
  10. DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
  11. DocumentBuilder builder = dFactory.newDocumentBuilder();
  12. Document doc;
  13. doc = builder.parse(new File("config.xml"));
  14. //获取包含图表类型的文本节点
  15. NodeList nl = doc.getElementsByTagName("chartType");
  16. Node classNode = nl.item(0).getFirstChild();
  17. String chartType = classNode.getNodeValue().trim();
  18. return chartType;
  19. }
  20. catch(Exception e) {
  21. e.printStackTrace();
  22. return null;
  23. }
  24. }
  25. }

在引入了配置文件和工具类XMLUtil之后,客户端代码修改如下:

[java]  view plain copy
  1. class Client {
  2. public static void main(String args[]) {
  3. Chart chart;
  4. String type = XMLUtil.getChartType(); //读取配置文件中的参数
  5. chart = ChartFactory.getChart(type); //创建产品对象
  6. chart.display();
  7. }
  8. }

不难发现,在上述客户端代码中不包含任何与具体图表对象相关的信息,如果需要更换具体图表对象,只需修改配置文件config.xml,无须修改任何源代码,符合“开闭原则”。

思考

在简单工厂模式中增加新的具体产品时是否符合“开闭原则”?如果不符合,原有系统需作出哪些修改?

5 简单工厂模式的简化

有时候,为了简化简单工厂模式,我们可以将抽象产品类和工厂类合并,将静态工厂方法移至抽象产品类中,如图3所示:

图3 简化的简单工厂模式

在图3中,客户端可以通过产品父类的静态工厂方法,根据参数的不同创建不同类型的产品子类对象,这种做法在JDK等类库和框架中也广泛存在。

6 简单工厂模式总结

简单工厂模式提供了专门的工厂类用于创建对象,将对象的创建和对象的使用分离开,它作为一种最简单的工厂模式在软件开发中得到了较为广泛的应用。

         1. 主要优点

简单工厂模式的主要优点如下:

(1) 工厂类包含必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的职责,而仅仅“消费”产品,简单工厂模式实现了对象创建和使用的分离。

(2) 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以在一定程度减少使用者的记忆量。

(3) 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

         2. 主要缺点

简单工厂模式的主要缺点如下:

(1) 由于工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响。

(2) 使用简单工厂模式势必会增加系统中类的个数(引入了新的工厂类),增加了系统的复杂度和理解难度。

(3) 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。

(4) 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

        3. 适用场景

在以下情况下可以考虑使用简单工厂模式:

(1) 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。

(2) 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。

练习

使用简单工厂模式设计一个可以创建不同几何形状(如圆形、方形和三角形等)的绘图工具,每个几何图形都具有绘制draw()和擦除erase()两个方法,要求在绘制不支持的几何图形时,提示一个UnSupportedShapeException。

简单工厂模式-Simple Factory Pattern 工厂三兄弟之简单工厂模式(四):图表库解决方案的改进,简单工厂模式的简化,简单工厂模式总结相关推荐

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

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

  2. 从零开始学设计模式(四):工厂模式(Factory Pattern)

    作者平台: | CSDN:blog.csdn.net/qq\_4115394- | 掘金:juejin.cn/user/651387- | 知乎:www.zhihu.com/people/1024- ...

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

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

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

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

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

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

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

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

  7. 设计模式的征途—2.简单工厂(Simple Factory)模式

    工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的"小弟",我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式, ...

  8. 简单工厂(Simple Factory)模式

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

  9. 【设计模式】工厂模式(Factory Pattern)

    1. 概述 工厂模式(Factory Pattern)是最常用的设计模式之一,它属于创建类型的设计模式.它提供了一种创建对象的最佳方式,在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通 ...

最新文章

  1. HDU - 4614 Vases and Flowers 线段树+二分
  2. 逆向学习技术!拆解驱动器,学习布局走线技术
  3. NYOJ 127 星际之门(一)
  4. 访问修饰符作用范围由大到小是_9个java基础小知识
  5. Entity Framework 并发处理
  6. 使用JavaScript分别实现4种样式的九九乘法表(1X1分别在左上、左下、右上、右下)...
  7. SharePoint自动化系列——Set MMS field value using PowerShell.
  8. 一种免费下载专利的方法
  9. 硬件射频测试和软件的区别,细说拉力试验机软件与硬件之间的区别
  10. Flash Builder4.7安装
  11. 如何制作绿色透明的立体字效果
  12. SCI写作经典替换词、核心词汇大集合
  13. python中的start_python中startx有什么用
  14. 产生随机数——起名神器
  15. java 地图四色着色算法_趣味地图系列之6 四色定理之我见
  16. transformer中相对位置编码理解
  17. 【NISP一级】备考2021年11月常见易错题型整理
  18. 看板管理方法的6大作用
  19. 网站优化如何挖掘长尾关键词?
  20. 迅雷发布“星域CDN” 做条颠覆市场的鲶鱼

热门文章

  1. 90多款matlab工具箱打包放送
  2. Kamiya丨Kamiya艾美捷大鼠成纤维细胞生长因子2说明书
  3. httpclient调用京东万象数字营销频道新闻api实例
  4. 使用 Flutter 开发 Google Translate 程序
  5. java.util.Date的getYear() .
  6. 图像拼接(十一):双摄像头实时拼接+stitching_detailed
  7. python富翁与陌生人编程_GitHub近10万星:印度小哥用Python和Java实现所有AI算法
  8. 奥运后,接手两个项目,PECT培训,CIW培训,系分考试...........一堆流水帐
  9. 东南大学计算机科学与技术夏令营,保研经验 | 排名第一,七项专利,拿到多个夏令营offer,成功上岸985!...
  10. jQuery实现对file对象的压缩