前天看了一个设计模式视频,是用Java实现简单工厂模式,要是用if……else来判断的话,改到.net下也是很好实现的,但是在Java里面用到了
反射的机制,这样就省去了工厂内部或是客户端内对要生产东西的判断。直接根据传进来的参数既可以完成生产。下面我给出我做的例子,先给出一般的通过if
……else来判断的:
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
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
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
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("造不了这种汽车。。。");
}
}
|
阅读(1529) | 评论(1) | 转发(0) |