您的位置:首页 > 其它

Dot Net 设计模式—简单工厂

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

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

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

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

2.2结构
假设我们要生成Vehicle的子类,结构如图所示。
‘交通工具是一个必须继承的基类
‘汽车
‘火车
‘船

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中获得数据库的类型和连接字串,然后调用相应的类实例化。
再举个例子就是很多的电子支付平台都用到了这个模式。如果你自己开发与各家银行的接口时也应当考虑简单工厂模式了。
这两个方案的实现代码很简单,这里就不再详细介绍了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: