Dot Net 设计模式—简单工厂

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

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

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

2..NET实现
2.1实现要点

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

2.2结构
假设我们要生成Vehicle的子类,结构如图所示。
                                    %E7%AE%80%E5%8D%95%E5%B7%A5%E5%8E%82%E7%9A%84%E7%BB%93%E6%9E%84.jpg
         从简单工厂的结构可以看出,简单工厂依赖于所有的产品子类,带来的好处是客户只需知道产品的父类和工厂即可。
2.3代码框架
下面是代码框架:
 ‘.NET示例代码

None.gif  ‘交通工具是一个必须继承的基类
ExpandedBlockStart.gifContractedBlock.gif 
Public   MustInherit   Class Vehicle Class Vehicle
InBlock.gif    
Protected m-TypeName As String
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public Property TypeName()Property TypeName() As String
InBlock.gif        
Get
InBlock.gif            
Return m-TypeName
InBlock.gif         
End Get
InBlock.gif         
Set(ByVal Value As String)
InBlock.gif            m
-TypeName = Value
InBlock.gif         
End Set
ExpandedSubBlockEnd.gif     
End Property
    
ExpandedSubBlockStart.gifContractedSubBlock.gif     
Public MustOverride Function Go()Function Go() As String
ExpandedBlockEnd.gif
End Class

None.gif‘汽车
ExpandedBlockStart.gifContractedBlock.gif
Public   Class Car Class Car
InBlock.gif    
Inherits Vehicle
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public Sub New()Sub New()
InBlock.gif        m
-TypeName = “汽车”
ExpandedSubBlockEnd.gif    
End Sub

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public Overrides Function Go()Function Go() As String
InBlock.gif        
Return “汽车在公路上开”
ExpandedSubBlockEnd.gif    
End Function

ExpandedBlockEnd.gif
End Class

None.gif‘火车
ExpandedBlockStart.gifContractedBlock.gif
Public   Class Train Class Train
InBlock.gif    
Inherits Vehicle
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public Sub New()Sub New()
InBlock.gif        m
-TypeName = “火车”
ExpandedSubBlockEnd.gif    
End Sub

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif
Public Overrides Function Go()Function Go() As String
InBlock.gif    
Return “火车在铁轨上开”
ExpandedSubBlockEnd.gif    
End Function

ExpandedBlockEnd.gif
End Class

None.gif‘船
ExpandedBlockStart.gifContractedBlock.gif
Public   Class Boat Class Boat
InBlock.gif   
Inherits Vehicle
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif   
Public Sub New()Sub New()
InBlock.gif       m
-TypeName = “船”
ExpandedSubBlockEnd.gif    
End Sub

ExpandedSubBlockStart.gifContractedSubBlock.gif
Public Overrides Function Go()Function Go() As String
InBlock.gif   
Return “船在水上走”
ExpandedSubBlockEnd.gif    
End Function

ExpandedBlockEnd.gif
End Class

None.gif
ExpandedBlockStart.gifContractedBlock.gif
Public   Class CreateAVehicle Class CreateAVehicle
InBlock.gif    ‘将创建方法定义为共享
ExpandedSubBlockStart.gifContractedSubBlock.gif    
Public Shared Function CreateAVehicle()Function CreateAVehicle(ByVal typeid As StringAs Vehicle
InBlock.gif        
Dim v As Vehicle
InBlock.gif        ‘根据参数确定需要创建的对象
InBlock.gif        
Select Case typeid.ToLower
InBlock.gif           
Case “car”
InBlock.gif               V 
= New Car
InBlock.gif           
Case “train”
InBlock.gif               V 
= New Train
InBlock.gif           
Case “Boat”
InBlock.gif               V 
= New Boat
InBlock.gif         
End Select
InBlock.gif    
InBlock.gif         
Return v
ExpandedSubBlockEnd.gif    
End Function

ExpandedBlockEnd.gif
End Class
   


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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值