摘要:设计模式一般是对某一类软件设计问题提出的通用的解决方案,将设计模式引入软件设计和开发过程,目的就在于充分利用已有的软件开发经验,甚至是已有的代码框架。最近一些年,设计模式已经成为软件项目团体中最热门的话题之一,而且常常在社区引发激烈的讨论。算法
本文介绍了设计模式的概念、描述、法则、分类以及程序设计语言与设计模式的关系,以实际案例介绍设计模式在软件开发中的应用,并在此基础上提出了一些软件设计与开发过程当中使用设计模式存在的问题。sql
关键词:设计模式;软件设计与开发;面向对象;数据库
面向对象的实质是一种系统建模技术,面向对象思想只是一种高级编程规范,咱们只有利用它,而且在总结和继承前人开发经验的基础上使用有特点的面向对象软件开发方法,才可能充分地利用其优越性,来解决咱们系统的各类需求及需求变动。编程
模式是一种方案,利用这种方案,咱们能够完成某项工做;模式也是一种途径,经过这种途径,咱们能够达到某个目的;同时,模式也是一种技术,咱们必须获取并利用有效的技术。设计模式也是一种模式,是一种完成某个目的或构思的方案。它要求使用某种面向对象提供的类及相关机制[1]。设计模式
模式(pattern)的概念最先由建筑大师 Christopher Alexander 于 20 世纪 70年代提出,应用于建筑领域。20 世纪 80 年代中期由 Ward Cunningham 和 Kent Beck 将其思想引入到软件领域,1994 年开始由 Hillside Group(由 Kent Beck 等发起成立)和 OOPSLA 联合发起了国际程序设计模式语言大会(Patterns Languages of Program Design,简称 PloP 或 PloPD),现在模式已成为软件工程领域内的一个热门话题,其在计算机领域的影响超过了在建筑界的影响[2]。oracle
GoF 在《设计模式:可复用面向对象软件基础》一书中概括出模式的四个基本要素:框架
设计模式的描述方法有天然语言描述法、形式化语言描述法等、统一标记语言(UML)描述法。编程语言
天然语言描述法比较简单、方便,但在现实与设计之间的过渡描述不够流畅。形式化语言主要包括DisCO、LePUS、Lay0M、ADV/ADO、CDL、PDL、PDSP等,其中DISCo侧重于描述设计模式中参与者的交互行为。ide
统一建模语言 UML 是在多种面向对象建模方法的基础上发展起来的建模语言,主要用于软件密集型系统的建模。在多种面向对象建模方法流派并存和相互竞争的局面中,UML 树起了统一的旗帜,使不一样厂商开发的系统模型可以基于共同的概念,使用相同的表示法,呈现彼此一致的模型风格。并且它从多种方法中吸取了大量有用的建模概念,使它的概念和表示方法在规模上超过了以往任何一种方法,而且提供了容许用户对语言作进一步的扩展机制。工具
在设计模式中,须要用到一些与 OOP 相关的法则,这些法则也是设计模式自身所依赖和体现的重要原则。经过使用这些法则,能够消除系统间的耦合性,提升系统内的内聚性,使系统更加灵活和易于维护 [3] 。
根据设计模式在粒度和抽象层次上各不相同,存在着众多的设计模式,咱们按照模式的目的(即模式是用来完成什么工做的)对模式进行分类,从而更好地分析和使用模式。模式依据其目的能够分红建立型 (Creational)、结构型(Struetural)、行为型(Behavioral)三种[4]。
1.建立型模式
社会化的分工愈来愈细,天然在软件设计方面也是如此,所以对象的建立和对象的使用分开也就成为了必然趋势。由于对象的建立会消耗掉系统的不少资源,因此单独对对象的建立进行研究,从而可以高效地建立对象就是建立型模式要探讨的问题。这里有6个具体的建立型模式可供研究,它们分别是:
简单工厂模式(Simple Factory);
工厂方法模式(Factory Method);
抽象工厂模式(Abstract Factory);
建立者模式(Builder);
原型模式(Prototype);
单例模式(Singleton);
2.结构型模式
在解决了对象的建立问题以后,对象的组成以及对象之间的依赖关系就成了开发人员关注的焦点,由于如何设计对象的结构、继承和依赖关系会影响到后续程序的维护性、代码的健壮性、耦合性等。对象结构的设计很容易体现出设计人员水平的高低,这里有7个具体的结构型模式可供研究,它们分别是:
外观模式(Facade);
适配器模式(Adapter);
代理模式(Proxy);
装饰模式(Decorator);
桥模式(Bridge);
组合模式(Composite);
享元模式(Flyweight);
3.行为型模式
在对象的结构和对象的建立问题都解决了以后,就剩下对象的行为问题了,若是对象的行为设计的好,那么对象的行为就会更清晰,它们之间的协做效率就会提升,这里有11个具体的行为型模式可供研究,它们分别是:
观察者模式(Observer);
状态模式(State);
策略模式(Strategy);
职责链模式(Chain of Responsibility);
命令模式(Command);
访问者模式(Visitor);
调停者模式(Mediator);
备忘录模式(Memento);
迭代器模式(Iterator);
解释器模式(Interpreter);
模式是不依赖于编程语言的[5]。从某种程度上讲,模式构成了一种语言,它比编程语言更进了一步,使开发人员能够彼此交流设计思想。然而,认识到特定的编程语言在软件系统的发展过程当中扮演着重要角色是很是重要的。如今,咱们必须考虑工具、库以及他们提供的通用环境,特别是当咱们考虑使用象Java和C#这样的新的面向对象程序设计语言时。这些语言不但提供了传统的编程语言语法,并且还构造在虚拟机之上,而且带有完整而丰富的库或包,使得开发和重用更加容易。
使用设计模式能为软件项目的设计与开发带来很大的优点,而要实现将模式转化为优点,须要根据实际状况,选择正确的设计模式。正确的将设计模式运用到软件设计与开发中,让整个软件的健壮性更强,让开发速度大大提升,本文将介绍基于抽象工厂的通用数据库访问层,此数据库访问层经过抽象工厂设计模式实现了多种类型的数据库的访问(Oracle,Sqlserver,Mysql,Sqlite等),大大方便了笔者的开发。
抽象工厂模式是类的建立模式之一, 其用意是定义一个建立产品对象的工厂接口, 将实际建立工做推迟到子类中。在工厂模式中, 核心的工厂类再也不负责全部产品的建立, 而是将具体建立工做交给子类去作。这个核心类仅负责给出具体工厂必须实现的接口, 而不接触产品类被实例化的细节。这使工厂模式能够容许系统在不修改工厂角色的状况下引进新产品[6]。
在基于.NET的实际的应用开发中ADO.NET数据访问模型为开发者提供了如下5个命名空间: System.Data.SqlClient,System.Data.odbc, System.Data.oracleC lient, System.Data.OleDb 和System.Data.SqlServerClient。分别用于访问SQL Server, 托管空间中的ODBC (Open DataBase Connectivity)数据源、Oracle、OLEDB ( Object Linking and Embedding DataBase) 数据源以及在托管的环境下从基于ServerCE中的数据库。所以, 根据工厂模式的设计思想, 将这几个对象进行封装, 造成一个含有这些对象公共方法的抽象类, 而没必要针对不一样的数据库类型分别编程实现。应用程序仅须要为客户端提供一个通用的耦合, 并极大地提升了代码的复用性和系统的扩展性。基于工厂模式的数据访问层类图如图1所示。
图 1基于抽象工厂模式的数据访问层类图
由于版面所限,此图只截取了SqlserverDBFactory,OracleDBFactory为例,其余数据库类型,只须要相应的添加相似的工厂便可实现,使用快捷方便。
数据库访问层经过DBHelper类与外界联系,其余类库调用DBHelper对数据库进行操做,DBHelper,建立DataBaseConnectEntity对象,建立对象的过程当中,根据配置文件中的数据库类型,选择相对于的数据库工厂,对DBFactory进行实例化。返回与数据库类型相对应的AdoHelper对象,AdoHelper对象提供了对数据库的具体操做方法。
应用设计模式和.NET平台进行数据访问层的设计,采用工厂模式思想实现了不一样数据库间的异构整合。
设计模式(Design pattern)是一套被反复使用、多数人知晓的、通过分类编目的、代码设计经验的总结。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石同样。虽然设计模式为提升软件开发效率以及可靠性提供了很美好的蓝图,然而,设计模式在实际软件设计与开发过程当中的使用却存在着一些须要克服的问题,如下列举几个问题:
(1) 代码复用引发的问题
代码复用本是软件设计与软件开发中很是优秀的特性,避免了重复制造轮子消耗的人力物力,而设计模式的存在更加便利了代码的复用。然而,因为一些疏忽或者理解上的误差,代码复用的过程当中忽略了一些可能由于BUG的可能,形成程序崩溃,甚至引起灾难也不是不可能的。因此,在代码复用的过程当中,必定要务必确认代码复用是否合理正确,是否是存在复用的可行性。
(2) 模式选用正确性的问题
虽然不少问题都是能够套用相应的设计模式进行设计,而后,不是运用了设计模式就是好的设计,若是对设计模式了解不够透彻,或者对业务了解不够深入,都狠容易形成设计模式使用不正确,影响设计的科学性,甚至影响软件最终运行的正确性。
(3) 过分设计的问题
简单是美,是软件开发中最最重要的一个准则。不只体如今代码简单化方便实现,并且BUG减小,容易维护,因此,可以简单实现的尽量简单实现,这应该是软件开发过程当中开发人员和设计人员应该遵循的第一准则。没有必要复杂的业务或者功能,套用复杂的设计模式,这原本就是有悖设计模式的初衷的。然而一些模式发烧友,偶尔会出现为了使用设计模式而使用设计模式的现象,不免出现过分设计,引发系统代码冗长,难以维护,简单业务复杂化等一些列本不应出现的问题。
设计模式是对特定问题通过无数次经验总结后提出的可以解决它的优雅的方案。可是,若是想要真正使设计模式发挥最大做用,仅仅知道设计模式是什么,以及它是如何实现的是很不够的,由于那样就不能使你对于设计模式有真正的理解,也就不可以在本身的设计中正确、恰当的使用设计模式。
设计模式并不只仅是一个有关特定问题的解决方案这个结果,它的意图以及它的动机每每更重要,由于一旦咱们理解了一个设计模式的意图、动机,那么在设计过程当中,就很容易的发现适用于咱们本身的设计模式,从而大大简化设计工做,而且能够获得一个比较理想的设计方案。
另外,在学习设计模式的过程当中,应该更加注意设计模式背后的东西,即具体设计模式所共有的的一些优秀的指导原则,基本上有两点[7]:
若是注意从这些方面来学习、理解设计模式,就会获得一些比单个具体设计模式自己更有用的知识,而且即便在没有现成模式可用的状况下,咱们也同样能够设计出一个好的系统来。
[1] 莫勇腾. 深刻浅出设计模式(C#/Java版)[M].北京:清华大学出版社,2006
[2] StevenJohnMetsker. C#设计模式[M].北京:中国电力出版社.2005
[3] 郭领艳. 软件设计模式的研究及应用. 天津大学硕士学问论文[D],2005
[4] 柳小文. 设计模式研究及应用.中南大学硕士学问论文[D],2007
[5] BrandonGlodfedder. 模式的乐趣[M].北京:清华大学出版社,2003
[6]金迪,陈晓玲,林和平.基于设计模式的.NET通用数据访问层研究.吉林大学学报[D],2010
[7] 孙鸣. 使用设计模式改善程序结构,IBM开发者论坛 2001