Factory 模式是一种非常基本同时也是被广泛使用的设计模式 我在这里就不多说了这种模式在框架程序设
计中经常被采用今天就说一下在NET 框架下的一个使用例子
首先请大家看一下如下代码段
int iCount = SystemTextEncodingDefaultGetByteCount(calStrTrim());
byte[] b = EncodingDefaultGetBytes(str);
Encoding encode = EncodingGetEncoding(thisFileEncode);
相信大家对于这样的代码司空见惯了吧 本人也是在使用很长一段时间之后才对里面的实现方式发生兴趣的
在了解了基本的算法逻辑后发现这个名Encoding这个抽象类的部分代码是使用 Factory 模式实现的
为了清楚说明这个问题本人将Factory 模式的基本结构图先发上来另外本人还附一张相应 Encoding
实现的结构图以便大家对比参照
Factory 图
net Encoding 结构图
这里需要说明的是Factory 结构图中的SimpleFactory部分在Encoding 代码中被合并了原因我猜应该是为了方便调用
和维护如果把GetEncoding() 拿出来放到SimpleFactory中也只是搬个家而已另外就是封装到了Encoding中同样也
会出现工厂模式所不可回避的问题就是如果新增加一种编码怎么办?让我们看看微软所做的一些尝试:
在GetEncoding(Int)函数里的switch 有如下代码
switch (codepage)
{
default:
unicode = GetEncodingCodePage(codepage);
if (unicode == null)
{
unicode = GetEncodingRare(codepage); //当编码很少见时
}
break;
}
在GetEncodingRare里面有一些少见编码的实例化调用具体的声明我就不多说了大家可以用
Reflactor 到 mscorlib 下的SystemTextEncodingGetEncodingRare(int codepage)函数即可 看到里
面的还有一些没有实现的case 条件段大家就应该明白了而有关codepage 设置参见
另外就是框架本身更新的速度还是非常快的(微软可能在将来某个版本中改动这部分的代码但目
框架下未发生变化)当然解决新加编码的方式不止一种有人建议用反射也有说用factory method的这
里就不多做介绍了(例如:)
还有一个地方就是如下对属性的声明
private static Encoding asciiEncoding;
public static Encoding UTF;
基本上对框架中主要的编码都有声明目前根据我的理解只是为了方便使用才这样安排的
因为这篇文章的内容只是学框架时的副产品因此里面的内容可读性不强同时肯定会有偏颇之
处如果大家有不同意见希望回复本人以纠正本人的误解希望不要误导大家:)