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

转载 2013年12月06日 11:58:50

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


 工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式。本章将要学习的简单工厂模式是工厂方法模式的“小弟”,它不属于GoF 23种设计模式,但在软件开发中应用也较为频繁,通常将它作为学习其他工厂模式的入门。此外,工厂方法模式还有一位“大哥”——抽象工厂模式。这三种工厂模式各具特色,难度也逐个加大,在软件开发中它们都得到了广泛的应用,成为面向对象软件中常用的创建对象的工具。

 

1 图表库的设计

       Sunny软件公司欲基于Java语言开发一套图表库,该图表库可以为应用系统提供各种不同外观的图表,例如柱状图、饼状图、折线图等。Sunny软件公司图表库设计人员希望为应用系统开发人员提供一套灵活易用的图表库,而且可以较为方便地对图表库进行扩展,以便能够在将来增加一些新类型的图表。

       Sunny软件公司图表库设计人员提出了一个初始设计方案,将所有图表的实现代码封装在一个Chart类中,其框架代码如下所示:

[java] view plaincopy
  1. class Chart {  
  2.     private String type; //图表类型  
  3.       
  4.     public Chart(Object[][] data, String type) {  
  5.         this.type = type;  
  6.         if (type.equalsIgnoreCase("histogram")) {  
  7.             //初始化柱状图  
  8.         }  
  9.         else if (type.equalsIgnoreCase("pie")) {  
  10.             //初始化饼状图  
  11.         }  
  12.         else if (type.equalsIgnoreCase("line")) {  
  13.             //初始化折线图  
  14.         }  
  15.     }  
  16.   
  17.     public void display() {  
  18.         if (this.type.equalsIgnoreCase("histogram")) {  
  19.             //显示柱状图  
  20.         }  
  21.         else if (this.type.equalsIgnoreCase("pie")) {  
  22.             //显示饼状图  
  23.         }  
  24.         else if (this.type.equalsIgnoreCase("line")) {  
  25.             //显示折线图  
  26.         }     
  27.     }  
  28. }  


       客户端代码通过调用Chart类的构造函数来创建图表对象,根据参数type的不同可以得到不同类型的图表,然后再调用display()方法来显示相应的图表。

       不难看出,Chart类是一个“巨大的”类,在该类的设计中存在如下几个问题:

       (1) Chart类中包含很多“if…else…”代码块,整个类的代码相当冗长,代码越长,阅读难度、维护难度和测试难度也越大;而且大量条件语句的存在还将影响系统的性能,程序在执行过程中需要做大量的条件判断。

       (2) Chart类的职责过重,它负责初始化和显示所有的图表对象,将各种图表对象的初始化代码和显示代码集中在一个类中实现,违反了“单一职责原则”,不利于类的重用和维护;而且将大量的对象初始化代码都写在构造函数中将导致构造函数非常庞大,对象在创建时需要进行条件判断,降低了对象创建的效率。

       (3) 当需要增加新类型的图表时,必须修改Chart类的源代码,违反了“开闭原则”。

       (4) 客户端只能通过new关键字来直接创建Chart对象,Chart类与客户端类耦合度较高,对象的创建和使用无法分离。

       (5) 客户端在创建Chart对象之前可能还需要进行大量初始化设置,例如设置柱状图的颜色、高度等,如果在Chart类的构造函数中没有提供一个默认设置,那就只能由客户端来完成初始设置,这些代码在每次创建Chart对象时都会出现,导致代码的重复。

       面对一个如此巨大、职责如此重,且与客户端代码耦合度非常高的类,我们应该怎么办?本章将要介绍的简单工厂模式将在一定程度上解决上述问题

 

      为什么要引入工厂类,大家可参见:创建对象与使用对象——谈谈工厂的作用

 

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


相关文章推荐

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

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

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

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

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

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
  • 472

Calculator(简单工厂模式)

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

简单工厂模式(计算器)

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

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