使用反射前后的参数化工厂方法

使用反射前后的参数化工厂方法

工厂方法模式定义一个用于创建对象的接口,使得一个类的实例化延迟到其子类。带参数的工厂方法可以创建多种产品,它采用一个标识来区分要创建对象的种类,而要创建的所有对象都必须共享同一个接口,或都是某个类的子类。

.Net框架中实现Hash算法的MD5CryptoServiceProvider和SHA1CryptoServiceProvider都是从HashAlgorithm继承的子类,我们采用参数化工厂方法来返回创建的对象。其C#实现为:

public  HashAlgorithm GetHashAlgorithm( string  method)
{
 
switch (method)
 {
  
case   " MD5 " :
   MD5 md5 
=   new  MD5CryptoServiceProvider();
   
return  md5;     
   
break ;
  
case   " SHA1 " :
   SHA1 sha1 
=   new  SHA1CryptoServiceProvider();
   
return  sha1;
   
break ;
 }  
 
return   null ;
}

说明:使用本代码时需要导入命名空间:
using System.Security.Cryptography;

这种实现方式可以根据参数来创建不同的对象,但编写该方法的代码时,必须知道所有的子类才可以实现。如果在未来有新增的方法,则必须修改工厂方法的代码。而反射在这一点上可以发挥自己的优势。例如下面的C#代码:

public  HashAlgorithm GetHashAlgorithm( string  method)
{
 
string  strClass = " System.Security.Cryptography. "   +  method  +   " CryptoServiceProvider " ;
 Assembly ass
= Assembly.Load( " mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 " );
 HashAlgorithm hash 
=  (HashAlgorithm)ass.CreateInstance(strClass); 
 
return  hash;
}

说明:使用本代码时需要导入命名空间:
using System.Security.Cryptography;
using System.Reflection;

另外下面的代码要放到配置文件的<compilation></compilation>段中。

<assemblies>
<add assembly="mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</assemblies>

上面的代码还有一些不足在于,如果更新了mscorlib库,则其Version和PublicKeyToken将会发生变化,这样同样也需要更改GetHashAlgorithm方法的代码。但毕竟mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089是一个字符串,同样也可以放到配置文件中来获取这个串。当mscorlib更新时,只要保证mscorlib实际版本与配置文件中的配置相对应即可。

如果是使用java语言,就不必使用反射了,因为它本身就提供的就是一个带参数的工厂方法。

MessageDigest sha = MessageDigest.getInstance("SHA-1");

说明:使用本代码时要导入包:
import java.security.*;

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值