工厂设计模式在WEB教育资源管理系统中的应用
2010-02-08刘军华胡志刚
刘军华,胡志刚
(中南大学软件学院,湖南长沙 410083)
任何一名会思考的软件开发人员随着自身开发经验的不断积累,软件理论理解的不断加深,都会不由自主地想一些方法或者捷径,来提高自己的编码效率,而不是一味的面对重复的问题做相同的工作,因为设计出高质量、低耗费、易维护和可复用的面向对象的程序是每一个软件开发工程师共同的追求。而设计模式就是为解决重复问题而提出的一套较好的解决方案。在软件设计和架构时,适当地使用设计模式可以给系统带来更大的可扩展性和尽量少的修改量。
1 设计模式简介
设计模式起源于建筑,首先由建筑设计师亚历山大提出的,然后推广到软件设计行业来。软件行业最早出现的设计模式著作是GOF(Gang Of Fours)四人组所著的那本《设计模式——可复用面向对象软件基础》,该书提出的设计模式共有23种,根据模式完成工作的不同,将设计模式划分为创建型模式、结构型模式和行为型模式三大类。创建型模式与对象的创建有关,结构型模式是处理类或对象的组合,行为型模式是对类和对象怎样交互和怎样分配职责进行描述。工厂设计模式属于创建型模式,根据其创建的形式的不同,工厂设计模式又有以下三种形态:
1)简单工厂模式 (Simple Factory):是用一个类来模拟工厂,通过该工厂类的静态方法返回具体的产品类,而这些产品又源自一个抽象的产品。
2)工厂方法模式 (Factory method):是类的创建模式,定义一个创建工厂接口,将实际的创建工作推到子类工厂中。也就是原本的静态类变成了一个抽象类或接口,而将制造的任务交给底下的具体实现类来完成。
3)抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖的对象的接口,而无须指定具体的类。
本文主要讨论工厂设计模式中的简单工厂模式和工厂方法模式在C#中的应用与实现,并通过Web教育资源管理系统为例体现工厂模式的优势。
2 WEB教育资源管理系统介绍
WEB教育资源管理系统是指利用计算机信息技术手段,面向各类高职院校,构建一个基于校园网络环境下,能实现对教育资源进行整合、归类、查询、共享、审核、管理的一个软件平台。主要功能有:
1)用户空间的申请与生成:本系统旨在让每一位教师拥有一个网上办公室,让每一位学生拥有一个网上学习空间。教师的工号和学生的学号即是空间的账号,并根据院校的组织机构自动生成相应的管理空间。如系部空间、班级空间等。
2)整合其它系统的资源:通过二次开发,能整合与共享各高职院校已经存在的系统中的信息资源。比如,学籍管理系统中的学生档案信息、教务管理系统中的教学安排信息等。
3)教育资源的开发与上传:每个空间的主人都是资源开发的主体,先由各院校自定义好各类教育资源的模板,然后开发者再按照规定的模板自行制作开发。
4)教育资源的管理与审核:当开发者将教育资源上传到服务器时,须经管理员的审核后才能显示在系统中,同时,为保护教育资源的使用权限,所有未注册、未授权用户只能浏览,不能复制和下载;为提高教育资源的质量,在系统中设为推荐、评价、浏览次数等机制,并以此作为对教师或学生评价的依据之一。
另外,根据系统的设计要求,我们将系统中所涉及到的教育资源按以下方式进行分类:
1)按专业大类划分:电子信息类、公共管理类等。
2) 按媒体格式划分:文本类、图形(像)类、音频类、视频类等。
3) 按学科课程划分:语文、数学、商务英语、计算机基础等。
4) 按资源种类划分:重要文件、通知公告、规章制度、工作计划、课程标准、实习实训项目、案例库、教案、课件、素材、习题集、试卷库、影片等。
其中,系统在具体设计实现的时候,主要以教育资源的媒体格式为依据进行程序开发。下面从程序开发的角度阐述设计模式使用前后的变化。
3 未使用设计模式的WEB教育资源管理系统
在C#创建对象的方式为:类名 对象名=new构造函数名();这是开发人员创建对象常用的方法格式,使用new创建对象的缺点是事先必须明确知道要实例化的类是什么,这样就违背了工程化的设计思想。下面用示例说明使用new的局限性。
在WEB教育资源管理系统中,教育资源类(Resource)、文本资源类(TxtResource)、图形/像资源类(PicResource)、视频资源类(FlvResource)等存在着继承关系,如图1所示。
图1 三种教育资源类与Resource的继承关系图
在C#中,一般情况下会按以下代码声明多态对象,从而引发多态:
按照图1的类设计思路,假若现在要分别调用文本资源类、图形/像资源类和视频资源类的显示方法来显示相应的资源内容,在客户端通常用以下代码来实现:
这样虽然能达到所需的效果,但客户端调用ResDisplay方法时就必须首先要知道是要显示哪一种类型的资源,即必须事先知道要实例化哪一个类,并且随着资源种类的不断增多,这种类似的代码还会重复更多。也就是说上述的代码有很大局限性,不够灵活,耦合性太高,不适合工程化的项目开发。
4 使用设计模式的WEB教育资源管理系统
4.1 使用简单工厂模式的WEB教育资源管理系统
为了提高上述代码的灵活性,降低耦合度,用户在创建对象时不必事先知道每次是要实例化哪一个类,为此我们引入了工厂设计模式中的简单工厂设计模式来解决这一问题。具体做法是,将创建实例的操作与使用实例的操作分开,构建一个模拟生成资源对象的工厂,把创建资源对象的操作全都放到了工厂里面去,客户端直接使用工厂内的创建资源对象的方法,只要传入需要的资源类型就行了,而不必去知道创建的细节。在加入简单工厂设计模式后,图1中类的关系修改如图2所示。
图2 使用简单工厂模式的教育资源类图
按照图2的类设计思路,假若现在要分别调用文本资源类、图形/像资源类和视频资源类的显示方法来显示相应的资源内容,就可以按以下代码方式去实现:
1)建立一个专门生产Resource实例的的工厂
这样,只需要传入需要创建资源的类型字符,工厂就会实例化合适的对象,通过多态,返回父类的方式实现了各种教育资源的显示。
4.2 使用工厂方法模式的WEB教育资源管理系统
按照简单工厂设计模式的做法,解决了创建对象的问题,降低了与具体类型资源的依赖。但也存在一些不够理想的地方,比如今后新增一种资源,除了增加相应的资源类以外,还得修改原有的资源工厂类,在switch中增加分支,这样不但对扩展开放了,对修改也开放了,这样就违背了“开放-封闭原则”。为此,我们采用工厂方法模式来解决这一问题。
根据依赖倒转原则,我们把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品(这里产品指资源)的工厂方法。然后,所有的要生产具体类的工厂,就去实现这个接口,这样,一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生成对象的工厂,于是我们今后要新增一个教育资源时,就不需要更改原有的工厂类了,只需要增加此资源类和相应的工厂类就可以了。应用工厂方法模式后,WEB教育资源管理系统中资源的类图修改如图3所示。
图3 使用工厂方法模式的教育资源类图
按照图3的类设计思路,假若现在要分别调用文本资源类、图形/像资源类和视频资源类的显示方法来显示相应的资源内容,在客户端通常用以下代码来实现:
这样,只需要修改资源工厂类名就可以创建相应的资源实例了,不要再修改原有的资源工厂类了,这样既克服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点,使得要创建其它对象时,不需要做大的改动就可实现,降低了客户端程序与资源类的耦合。
5 结束语
本文论述了工厂模式中的简单工厂设计模式和工厂方法设计模式在重构WEB教育资源管理系统中的应用,通过对比展示应用模式后可以很好地解决功能的扩展的问题以及提高代码的可重用性和可维护性。当开发人员在编码时不能预见需要创建哪一种类的实例或不希望创建了哪个类的实例以及如何创建实例的信息暴露给外部程序的时候,我们建议这个时候使用工厂模式是较好的一种方案,因为工厂模式就是专门负责将大量有共同接口的类实例化,而且不必事先知道每次是要实例化哪一个类的模式。
[1]程杰.大话设计模式[M].北京:清华大学出版社,2009.
[2]徐卫星.设计模式之工厂模式在招生系统中的应用[J].微型机与应用,2007,(11).
[3]Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides. Design Paaerns:Elements of Reusable Object-Oriented software[M].北京:机械工业出版社,2005.
[4]唐文芳.在数据访问层使用抽象工厂设计模式的c#实现[J].硅谷,2009,(8).