工厂三兄弟之简单工厂模式(四)

转载 2013年12月06日 12:02:02

文章转载:http://blog.csdn.net/lovelion/article/details/9300731


4 方案的改进

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

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

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

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

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

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

[java] view plaincopy
  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中,客户端可以通过产品父类的静态工厂方法,根据参数的不同创建不同类型的产品子类对象,这种做法在JDK等类库和框架中也广泛存在。

 

6 简单工厂模式总结

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

         1. 主要优点

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

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

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

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

 

         2. 主要缺点

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

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

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

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

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

 

        3. 适用场景

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

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

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

疑问

练习

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

【作者:刘伟 http://blog.csdn.net/lovelion


相关文章推荐

工厂三兄弟之简单工厂模式(四)

4 方案的改进       Sunny软件公司开发人员发现在创建具体Chart对象时,每更换一个Chart对象都需要修改客户端代码中静态工厂方法的参数,客户端代码将要重新编译,这对于客户端而言,违反了...
  • LoveLion
  • LoveLion
  • 2013年07月11日 14:55
  • 14589

工厂三兄弟之简单工厂模式(一)

工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式。本章将要学习的简单工厂模式是工厂方法模式的“小弟”,它不属于GoF 23种设计模式,但在软件...
  • LoveLion
  • LoveLion
  • 2013年07月11日 14:24
  • 21430

工厂三兄弟之简单工厂模式(二)

2 简单工厂模式概述简单工厂模式并不属于GoF 23个经典设计模式,但通常将它作为学习其他工厂模式的基础,它的设计思想很简单,其基本流程如下:首先将需要创建的各种不同对象(例如各种不同的Chart对象...
  • will130
  • will130
  • 2016年01月02日 00:18
  • 134

工厂三兄弟之简单工厂模式(二)

2 简单工厂模式概述        简单工厂模式并不属于GoF 23个经典设计模式,但通常将它作为学习其他工厂模式的基础,它的设计思想很简单,其基本流程如下:        首先将需要创建的各种不...

工厂三兄弟之简单工厂模式(三)

3 完整解决方案为了将Chart类的职责分离,同时将Chart对象的创建和使用分离,Sunny软件公司开发人员决定使用简单工厂模式对图表库进行重构,重构后的结构如图2所示: 在图2中,Chart接口...
  • will130
  • will130
  • 2016年01月02日 21:33
  • 140

简单工厂模式

  • 2017年08月16日 20:07
  • 60.84MB
  • 下载

简单工厂模式的C++、Java实现

  • 2017年02月04日 18:05
  • 21.84MB
  • 下载

简单工厂模式(三)

3 完整解决方案        为了将Chart类的职责分离,同时将Chart对象的创建和使用分离,Sunny软件公司开发人员决定使用简单工厂模式对图表库进行重构,重构后的结构如图2所示: ...
  • Mark_LQ
  • Mark_LQ
  • 2015年04月12日 21:33
  • 473

Calculator(简单工厂模式)

  • 2014年04月04日 12:37
  • 550KB
  • 下载

简单工厂模式(计算器)

  • 2014年07月11日 16:57
  • 31KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:工厂三兄弟之简单工厂模式(四)
举报原因:
原因补充:

(最多只允许输入30个字)