vb.net 中通过反射实现简单工厂模式
2009-11-07 09:39
746 查看
前天看了一个设计模式视频,是用Java实现简单工厂模式,要是用if……else来判断的话,改到.net下也是很好实现的,但是在Java里面用到了反射的机制,这样就省去了工厂内部或是客户端内对要生产东西的判断。直接根据传进来的参数既可以完成生产。下面我给出我做的例子,先给出一般的通过if ……else来判断的:
这样就可以通过if判断来生产不同的汽车。但是如果要在添加新的汽车类呢?比如说要添加一个Bus类,就必须得改动Factory类。这在设计模式上是不合理的,因为“对修改封闭-对扩充开放”
那么在vb.net中如何使用反射机制呢?
下面给出我的例子:
首先是建立一个类库命名为SimpleCar,代码如下:
然后生成解决方案。
新建一个控制台程序:
这样就可以不用if……else来判断就可以生成相应的类了。
但是这个并没有解决我的疑问,因为在Java中可以通过制定相应的包和类就可达到反射的效果,但是在vb.net中还得生成dll才行。我想应该还有别的方法,要不修改dll文件也不是容易的事。不过相对来说比if……else更为灵活一些。
下面是Java的简单工厂代码:
]Imports System.Reflection Imports System.ComponentModel Module SimpleFactory Sub Main() Dim objCar As Object = Factory.getCarInstance("Benz") If objCar IsNot Nothing Then objCar.run() objCar.finish() Else Console.WriteLine("没有这种汽车") End If Console.Read() End Sub End Module Class Factory Public Shared Function getCarInstance(ByVal type As String) Dim myCar As Object = Nothing Try If (type = "Benz") Then myCar = New Benz ElseIf (type = "Ford") Then myCar = New Ford End If Catch ex As Exception MsgBox("出错:" + ex.Message) End Try Return myCar End Function End Class Interface Car Sub run() Sub finish() End Interface Public Class Benz : Implements Car Public Sub finish() Implements Car.finish Console.WriteLine("Benz生产好了。。。。") End Sub Public Sub run() Implements Car.run Console.WriteLine("Benz开始生产。。。。") End Sub End Class Public Class Ford : Implements Car Public Sub finish() Implements Car.finish Console.WriteLine("Ford生产好了。。。。") End Sub Public Sub run() Implements Car.run Console.WriteLine("Ford开始生产。。。。") End Sub End Class
这样就可以通过if判断来生产不同的汽车。但是如果要在添加新的汽车类呢?比如说要添加一个Bus类,就必须得改动Factory类。这在设计模式上是不合理的,因为“对修改封闭-对扩充开放”
那么在vb.net中如何使用反射机制呢?
下面给出我的例子:
首先是建立一个类库命名为SimpleCar,代码如下:
]Interface Car Sub run() Sub finish() End Interface Public Class Benz : Implements Car Public Sub finish() Implements Car.finish Console.WriteLine("Benz生产好了。。。。") End Sub Public Sub run() Implements Car.run Console.WriteLine("Benz开始生产。。。。") End Sub End Class Public Class Ford : Implements Car Public Sub finish() Implements Car.finish Console.WriteLine("Ford生产好了。。。。") End Sub Public Sub run() Implements Car.run Console.WriteLine("Ford开始生产。。。。") End Sub End Class
然后生成解决方案。
新建一个控制台程序:
Imports System.Reflection Imports System.ComponentModel Module SimpleFactory Sub Main() Dim aCar As Object = Factory.getCarInstance("Benz") If aCar IsNot Nothing Then aCar.run() aCar.finish() Else Console.WriteLine("没有这种汽车") End If Console.Read() End Sub End Module Class Factory Public Shared Function getCarInstance(ByVal type As String) Dim myDll As [Assembly] Dim objCar As Object = Nothing '将生成的dll加载进来 myDll = [Assembly].LoadFrom _ ("F:/我的vs2008/pattern/SimpleCar/SimpleCar/bin/Debug/SimpleCar.dll") '通过传递的参数生成相应的类 objCar = myDll.CreateInstance("SimpleCar." + type) Return objCar End Function End Class
这样就可以不用if……else来判断就可以生成相应的类了。
但是这个并没有解决我的疑问,因为在Java中可以通过制定相应的包和类就可达到反射的效果,但是在vb.net中还得生成dll才行。我想应该还有别的方法,要不修改dll文件也不是容易的事。不过相对来说比if……else更为灵活一些。
下面是Java的简单工厂代码:
package org.jzkangta.factorydemo03; interface Car{ public void run(); public void stop(); } class Benz implements Car{ public void run(){ System.out.println("Benz开始启动了。。。。。"); } public void stop(){ System.out.println("Benz停车了。。。。。"); } } class Ford implements Car{ public void run(){ System.out.println("Ford开始启动了。。。"); } public void stop(){ System.out.println("Ford停车了。。。。"); } } class Toyota implements Car{ public void run(){ System.out.println("Toyota开始启动了。。。"); } public void stop(){ System.out.println("Toyota停车了。。。。"); } } class Factory{ public static Car getCarInstance(String type){ Car c=null; try { c=(Car)Class.forName("org.jzkangta.factorydemo03."+type).newInstance(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return c; } } public class FactoryDemo03 { public static void main(String[] args) { Car c=Factory.getCarInstance("Toyota"); if(c!=null){ c.run(); c.stop(); }else{ System.out.println("造不了这种汽车。。。"); } }
相关文章推荐
- vb.net 中通过反射实现简单工厂模式
- SqlHelper简单实现(通过Expression和反射)6.Providor模式(工厂+策略)可配置数据库选择
- 通过我买西瓜霜来看外观模式(vb.net实现)
- 工厂模式实现方式、使用场景(包括基于反射的简单工厂模式)
- 反射实现简单工厂模式
- 使用反射来实现简单工厂模式
- java通过反射机制实现工厂设计模式
- 通过商场促销来看策略模式+vb.net实现
- 1、简单工厂模式——反射+Properties实现计算器
- asp.net通过反射技术实现Ajax(3)--第一个简单的例子
- 简单的用反射实现工厂模式
- (设计模式)简单工厂模式之通过配置文件动态创建实现类
- java 枚举和反射 实现简单的工厂模式
- 用Properties和反射实现简单的 工厂模式
- PetShop4.0视频讲解 - 通过简单案例理解petshop4.0的工厂模式
- 外观模式-facade实现interface的方式(简单工厂+facade组合使用)
- Java基础之反射及动态代理,反射实现工厂模式
- Java反射机制(五):使用反射增强简单工厂设计模式
- 设计模式一(简单工厂,采用python实现)
- 设计模式 -- 简单工厂模式 -- c++实现