JAVA
- 格式:pdf
- 大小:119.47 KB
- 文档页数:3
Mic ocomputer Applications Vo1.18・No.9.2O02 技术交流 微型电脑应用 2002年第18卷第9期 JAVA程序开发中的设计模式 张世博 周树杰 闽 艳 摘要随着软件产品的复杂化,开发的难度越来越大, 不仅仅是技术要求的提高,而且要求软件的开发效率必须跟 得上,避免开发速度滞后,导致最终产品与实际应用的差距。 因此为了提高开发效率,在开发产品中设计模式的重要性越 来越提高到了更高的层次。本篇文章就是针对在JAVA程序 开发中的设计模式来讲述,给出了采用设计模式的由来,普遍 存在的设计模式,以及给出了采用设计模式的示例。 关键词设计模式工厂方法Java 一、设计模式简介 设计模式(Design Pattern)针对面向对象系统中重复出 现的设计问题,提出一个通用的设计方案,并予以系统化的命 名和动机解释。它描述了问题、提出了解决方案,并指出在什 么条件下使用该方案以及其效果。该解决方案是解决该问题 的一组精心安排的通用的类和对象.再经过定制和实现就可 用来解决特定的上下文中的问题。 简单来说.设计模式就是一个常用的方案。在我们的开发 过程中经常会遇到一些相同或相近的问题,如果每次都寻找 一个相应的解决办法,那么就会增加开发时间,降低开发效 率。为了节省时间,提高开发效率,就需要提供一些解决类似 问题的.在应用中被证明可行的方案 设计模式。所以一个 设计模式就是描述了一个被证明可行的方案,这些方案可以 重用.有良好的伸缩性。 一般而言,一个设计模式有四个要素: 1.模式名称(Pattern Name)这是一个助记名。它用一两 个词来描述模式的问题.解决方案和效果。设计模式允许我们 在较高的抽象层次上进行设计,基于一个模式词汇表,开发者 之间就可以讨论模式并在编写文档时使用它们.模式名可以 帮助我们思考.便于与其他人交流设计思想。 2.问题(Problem)它的作用是描述应在何时使用模式,解 释采用设计模式的原因.描述了特定的设计问题,问题的所在 即为使用模式的先决条件。 3.解决方案(Solution)描述了设计模式的组成部分,各部 分之间的相互关系、各自的职责。因为模式就像一个模版,可 应用于多种场合,所以解决方案并不描述一个特定而具体的 设计,而是提供设计问题的抽象描述。 4.效果(Consequences)描述了模式使用的效果,以及模 式使用应权衡的问题。尽管我们描述设计决策时,并不总提到 设计效果,但是它们对于评价使用模式的代价有重要的意义。 因为复用是面向对象设计的要素之一,所以模式效果可以显 示的列出它对系统的灵活性,扩展性、可移植性的影响,对于 评价模式很有帮助。 设计模式有不同的分类方法,设计模式按照目的分类,有 三类: 1.创建型(Creationa1) 创建型模式与对象的创建有关。常见的有:抽象工厂(Ab— stract Factory)、生成器(Bulider)、工厂方法(Factory Method) 等型。 2.结构型(Structura1) 结构型模式是处理类或对象的组合。常见的有:适配器 (Adapter)、桥接(Bridge)、装饰(Decorator)等型。 3.行为型(Behaviora1) 行为型模式对类或对象如何交互和如何分配职责进行描 述。常见的有:命令(Command)、策略(Strategy)等型。 每一种模式都是针对一定的问题提出的.没有一种模式 是万能的。下面简单介绍笔者在实践中用到的Factory Method 二、工厂方法模式应用介绍 Factory Method是一个创建性的模式。它定义了一个用 于创建对象的窗口,让子类来决定具体实例化哪个类。当一个 类无法预料要创建哪种类的对象或是一个类需要由子类来指 定创建的对象时,我们就需要用到Factory Method模式了。 Factory Method可以根据不同的条件产生不同的实例。当然 这些不同的实例通常属于相同的类型,有共同的父类.Facto— ry Method把创建这些实例的具体过程封装起来了,简化了 客户端应用,使得将来做最小的改动就可以加入新的待创建 的类。但是Factory Method模式创建时并不一定会让我们的 代码更短,事实上往往更长,类使用的也更多,真正的目的在 于可以灵活的、有弹性的创建不确定的对象。 以下是Factory Method模式的结构图: 关键词汇说明: Product:需要创建的实例的抽象类 . ConcreteProduct:Product的子类,具体的实例 张世博北京石油化工学院计算机系硕士研究生 京 0261..7. 周树悉北京石油化工学院计算机系教授教授硕士生导师北京102617 ・45・
维普资讯 http://www.cqvip.com Mjcrocomputer Applications Vo1.18,No.9,2002 技术交流 微型电脑应用 2002年第18卷第9期 Product 7 oncn№P|oduct 图l Factory Method模式结构图 Creator:抽象创建器的接口.声明返回Product类型对象 的Factory Method ConcreteCreator:具体的创建器,重写了Creator中的 Factory Method,返回ConcreteProduct类型的实例。 之所以不直接用具体的产品和具体的创建器来完成需 求,是因为通过Factory Method模式来完成以下的好处及效 果: 1.Client端可以统一从抽象创建器获取产生的实例。Cre— ator的作用将Client和实例创建的过程分离开来,客户不用 操心返回的是哪一个具体实例,也不用关心实例是如何创建 的.同时ConcreteProduct也由Product继承了Product的所 有属性,并实现了Product中定义的抽象方法。通过Concrete— Creator产生的ConcreteProduct可自动上溯造型成为Prod— uct.这样实质内容不同的ConcreteProduct可以在形式上统 一为Product.通过Creator提供给Client来访问。 2.当添加一新的ConcreteProduct时.由于Creator所提 供的接口不变,程序不会有丝毫的改动.这就是封装的体现。 优良的面向对象的设计鼓励使用封装(encapsulation)和委托 (delegation)。在Factory Method中.封装通过抽象创建器 Creator来实现,委托则通过抽象创建器把创建对象的责任完 全交给具体的创建器ConcreteCreator来体现。 3.工厂方法不再将与特定应用有关的类绑定到代码中。 代码仅处理Product接口。因此可以与用户定义的任何Con— creteProduct类一起使用。 三、举例说明实现过程 这个例子的作用是创建不同的Body个体实例.每种个体 有2个操作:Add和Delete。 具体的创建过程委托给BodyFactory来完成。 Abstract class Body{ Public Body(String)str—type){ type—str—type: ) public abstract void Add(); public abstract void Delete(); String type; ) 这个Body抽象类有2种抽象方法,Add(),Delete(),接 下来定义由Body派生的实体,并实现每个实体中的方法。 Class Driver extends Body{ Public Driver(String str—dry—name){ Super(str—dry—name); ) public void Add(){ System.out.println(”Add a driver”); ) public void Delete(){ System.out.println(”Delete a driver”): ) ) Class Customer extends Body{ Public Customer(String str—CUS—name){ Super(str—CUS~name); ) public void Add(){ System.OUt.println( Add a customer ); ) public void Delete(){ System.OUt.println(”Delete a customer”); ) ) 接下来定义抽象创建器,executeOperation调用facto— ryMethod创建一个对象,并对该对象进行一系列的操作。 Abstract class Body Factory{ Protected abstract Body factoryMethod(String str— bname); Public void executeOperation(String name){ Body bodyFact—factoryMethod(name): System.OUt.println(”The current body is”+bodyFact. name); bodyFact.Add(); bodyfact.Delete(); } ) 再定义两个实体的具体创建器,实现父类的facto— ryMethod方法。 Class DriverFactory extends BodyFactory{ Protected Body factoryMethod(String name) return new Driver(name+”Created by DriverFactory”) ) ・46・
维普资讯 http://www.cqvip.com Microcomputer Applications Vo1.18,No.9,2002 技术交流 微型电脑应用 2002年第l8卷第9期 } Class CustomerFactory extends BodyFaetory{ Protected Body factoryMethod(String name) return new Customer(name ”Created by CustomerFac— tory”); ) ) 最后是编写客户调用测试类 class mian{ public static void main(String[-]args){ BodyFaetory bf—drv—new DriverFactory(); BodyFaetory bf—eus—new CustomerFactory(); bf—drv.executeOperation(”Driver”): bf—eus.executeOperation(”Customer”); ) ) 运行结果如下: The current body is Driver(Created by DriverFactory) Add a driver Delete a driver The current body id Customer(Created by CustomerFactory) Add a customer Ddelete a customer 以上以一个简单的例子来说明了在抽象层次上达到统一 的时候如何采用Factory Method设计模式。Factory Method 看似简单,实则深刻,抽象、多态、继承等面向对象的概念都在 这儿得到了一一体现,只有抓住了本质,才能够不拘于形式做 到灵活运用,而不是为了使用模式而使用模式。工厂方法的一 个潜在的缺点在于客户可能为了创建一个特定ConcretePro— duct,就不得不创建Creator的子类,这样就是程序的逻辑复 杂了。 四、结论 设计模式可能会导致代码庞大,而且程序难懂,但是对于 一个不熟悉系统的开发者来说,可以很快的投入到他的工作 中去。设计模式一个很重要的实现原则是封装变化.也就是对 易变的功能进行封装,这儿的易变指的是将来需求可能变更 或者某些类对于这个功能有不同的实现。封装则指的是用面 向对象的方法(封装、多态)对这一块功能进行单独处理,运用 设计模式可能会导致代码庞大,流程复杂,所以如果不是必 须,不要滥用设计模式,试想,如果一个功能,明知道它的需求 是固定的,而且不需对其复用,那为什么不怎么简单怎么作 呢?另外,关于模式的使用上常常存在这样的误解,以为模式 是某种场景下某个问题的解决方案。其实模式的设计不是针 对某个问题的。而是具有可重复性的,对于在抽象层次上可以 统一起来的实例,可以考虑采用设计模式。 参考文献 [,1]Erich Gamma等著,李英军等译,《设计模式》,机械工业出 版社 [-2-]Bruce Eckel著,《JAVA编程思想》,机械工业出版社 (收稿日期:2002年4月4日) (上接第58页) nr++; if(dymanic—cast(shape*>(shapes[,u])) ns++ ) …//各种对象个数输出 cout((shapes.count()<<endl; return 0; ) 程序中tstash是一种自定义的拥有自识别能力的容器。 六、结束语 本文对STL的基本概念、基本的使用方法及应用STL 编程时应注意的事项进行了较为深刻的探讨,了解这些可以 有助于在应用STL编程时解决一些实际的问题。我们可以通 过编写程序来充分的利用STL的资源,开发满足自己需要的 程序,更有效地完成我们的工作。 参考文献 [1]Bjarne Stroustrup,The C++PR0GRAMM1NG LAN— GUAGE,高等教育出版社,2001.8. [,2]Stanley B.Lippman.Essent ial c++,华中科技大学出版 社,2001.8. [-3-]Bruce Eckel,刘宗田等.Thinking in c++,北京:机械工 业出版社.2000 ・47・ (收稿日期:2002年