您的位置:首页 > 其它

Dot Net 设计模式—简单工厂

2008-05-08 13:25 239 查看
1.前言
1.1概要
简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类。
在GOF的设计模式中并没有简单工厂,而是将其作为工厂方法的一个特例加以解释。可以这样理解,简单工厂是参数化的工厂方法。

1.2使用场合
简单工厂实例化的类具有相同的接口,类类有限并且基本不需要扩展时,可以使用简单工厂。例如,数据库连接对象,常用的数据库类类可以预知,则使用简单工厂。

1.3效果
采用简单工厂的优点是可以使用户根据参数获得对应的类实例,避免了直接实例化类,降低了耦合性;缺点是可实例化的类型在编译期间已经被确定,如果增加新类 型,则需要修改工厂。简单工厂需要知道所有要生成的类型,当子类过多或者子类层次过多时不适合使用。

2..NET实现
2.1实现要点
通常简单工厂不需要实例化,而是采用静态方法。在VB.NET中称为“共享方法”,因为简单工厂一般只负责实例化工作。在C#中静态方法采用statics关键字,在VB.NET中采用Shared关键字。
另一个实现要点不在工厂本身,而在需要被实例化的类,抽象类和接口方法可以实现对具体类的抽象。对于简单工厂而言,采用这两种方法都可以获得相同的效果。然而考虑到系统的易维护性和可扩展性,必须要讨论两种方案的优劣。
如果需要被实例化的子类有大量相同代码,则可以考虑采用抽象类,这样可以减少代码的重复。例如,子类有大量的共有属性。然而这样做的缺点是扩展性不好,子 类之间存在潜在的耦合性。因此通常的情况下可以考虑采用接口替代抽象类,具体类通过实现这个接口可以获得同样的效果。

2.2结构
假设我们要生成Vehicle的子类,结构如图所示。



从简单工厂的结构可以看出,简单工厂依赖于所有的产品子类,带来的好处是客户只需知道产品的父类和工厂即可。
2.3代码框架
下面是代码框架:
‘.NET示例代码


‘交通工具是一个必须继承的基类




Public MustInherit Class VehicleClass Vehicle


Protected m-TypeName As String




Public Property TypeName()Property TypeName() As String


Get


Return m-TypeName


End Get


Set(ByVal Value As String)


m-TypeName = Value


End Set


End Property




Public MustOverride Function Go()Function Go() As String


End Class


‘汽车




Public Class CarClass Car


Inherits Vehicle




Public Sub New()Sub New()


m-TypeName = “汽车”


End Sub






Public Overrides Function Go()Function Go() As String


Return “汽车在公路上开”


End Function


End Class


‘火车




Public Class TrainClass Train


Inherits Vehicle






Public Sub New()Sub New()


m-TypeName = “火车”


End Sub






Public Overrides Function Go()Function Go() As String


Return “火车在铁轨上开”


End Function


End Class


‘船




Public Class BoatClass Boat


Inherits Vehicle






Public Sub New()Sub New()


m-TypeName = “船”


End Sub




Public Overrides Function Go()Function Go() As String


Return “船在水上走”


End Function


End Class






Public Class CreateAVehicleClass CreateAVehicle


‘将创建方法定义为共享




Public Shared Function CreateAVehicle()Function CreateAVehicle(ByVal typeid As String) As Vehicle


Dim v As Vehicle


‘根据参数确定需要创建的对象


Select Case typeid.ToLower


Case “car”


V = New Car


Case “train”


V = New Train


Case “Boat”


V = New Boat


End Select




Return v


End Function


End Class

本节描述的是传统的实现方式,在.NET开发环境中可以采用前面讲的反射方法简化其实现。

3.简单工厂的应用
简单工厂应用的范围很广,在一个应用中我们可以反复应用它,使程序易于维护。例如,在采用ASP .NET开发的Web应用中,为使应用支持多种类型的数据库,可以使用前面介绍的方法。这时,可以将数据库的类型和连接字串作为参数保存在 Web.Config文件中。当采用的数据库类型发生变化时,只要改变这些参数即可。
当客户需要获得一个数据库连接时,首先从Web.Config中获得数据库的类型和连接字串,然后调用相应的类实例化。
再举个例子就是很多的电子支付平台都用到了这个模式。如果你自己开发与各家银行的接口时也应当考虑简单工厂模式了。
这两个方案的实现代码很简单,这里就不再详细介绍了.

以上文章转自:http://www.cnblogs.com/fineboy/archive/2005/08/04/207293.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: