posts - 283,  comments - 6275,  trackbacks - 107

        Factory 模式是一种非常基本同时也是被广泛使用的设计模式, 我在这里就不多说了,这种模式在框架程序设
计中经常被采用,今天就说一下在.NET 框架下的一个使用例子。

首先请大家看一下如下代码段:

int iCount = System.Text.Encoding.Default.GetByteCount(calStr.Trim());
.....
byte[] b = Encoding.Default.GetBytes(str);
.....
Encoding encode = Encoding.GetEncoding(this.FileEncode);
.....

         相信大家对于这样的代码司空见惯了吧, 本人也是在使用很长一段时间之后,才对里面的实现方式发生兴趣的,
在了解了基本的算法逻辑后,发现这个名Encoding这个抽象类的部分代码是使用 Factory 模式实现的。
         为了清楚说明这个问题,本人将Factory 模式的基本结构图先发上来,另外本人还附一张相应的.net Encoding
实现的结构图,以便大家对比参照:


Factory 图

 

.net Encoding 结构图


         这里需要说明的是Factory 结构图中的SimpleFactory部分在Encoding 代码中被合并了,原因我猜应该是为了方便调用
和维护。如果把GetEncoding() 拿出来放到SimpleFactory中,也只是“搬个家”而已。另外就是封装到了Encoding中同样也
会出现工厂模式所不可回避的问题就是如果新增加一种编码怎么办?让我们看看微软所做的一些"尝试":

    在GetEncoding(Int32)函数里的switch 有如下代码

     switch (codepage)
     {
          .......
   default:
                    unicode = GetEncodingCodePage(codepage);
                    if (unicode == null)
                    {
                        unicode = GetEncodingRare(codepage); //当编码很少见时
                    }
                    break;
           ......
      }

        在GetEncodingRare里面有一些少见编码的实例化调用,具体的声明我就不多说了,大家可以用
Reflactor 到 mscorlib 下的System.Text.Encoding.GetEncodingRare(int codepage)函数即可, 看到里
面的还有一些没有实现的case 条件段大家就应该明白了。而有关codepage 设置参见
http://www.cppblog.com/shenhuafeng/archive/2007/04/05/21336.html

        另外就是框架本身更新的速度还是非常快的(微软可能在将来某个版本中改动这部分的代码,但目前.net3.0
框架下未发生变化)。当然解决新加编码的方式不止一种,有人建议用反射,也有说用“factory method”的,这
里就不多做介绍了。(例如:http://blog.csdn.net/linzhisong/archive/2007/07/13/1687887.aspx)


         还有一个地方就是如下对属性的声明
         private static Encoding asciiEncoding;
         public static Encoding UTF8;

         ......
         基本上对框架中主要的编码都有声明。目前根据我的理解只是为了方便使用才这样安排的。
  
         因为这篇文章的内容只是学习.net框架时的“副产品”,因此里面的内容可读性不强,同时肯定会有偏颇之
处。如果大家有不同意见,希望回复本人,以纠正本人的误解,希望不要误导大家:)
  

posted on 2007-07-27 11:44 代震军 阅读(3292) 评论(9) 编辑 收藏

FeedBack:
2007-07-27 11:51 | 永红      
看来大家对Factory模式都很熟悉了。
 回复 引用 查看   
2007-07-27 12:34 | Osamede      
简明易懂,又帮我学习了下factory模式。
不过对GetEncodingRare这个函数还是比较迷茫,如果出现新编码,
这样就能解决?

 回复 引用 查看   
2007-07-27 12:35 | daizhj[未注册用户]
@永红
其实我真希望大家都研究一下.net框架,里面有价值的东西很多,特别是架构设计方面的:)

 回复 引用   
2007-07-27 12:38 | daizhj[未注册用户]
GetEncodingRare函数本身很难做到一劳永逸,希望微软能找到更好的办法
 回复 引用   
2007-07-27 23:07 | Jonny Yu      
Factory模式只是为了对使用者封闭创建对象的变化,它本身并不解决Factory自身实现的变化封闭问题。在考虑使用Factory模式的时候考虑如何让Factory自身能够更灵活更可扩展,这个根本不是一个问题。

 回复 引用 查看   
2007-07-28 10:04 | 镜涛      
如果有很多可以实例化的对象,使用Factory模式就会有很多switch 或者if else的判断,不知道这样的时候要怎么办?
 回复 引用 查看   
2007-07-28 11:02 | Jonny Yu      
@镜涛
其实你的问题是,如果有个问题其中要分很多情况处理,这样的设计如何做到可扩展?

其实简单情况下,该写switch的还是要写,该判if-else的还是要判,
稍复杂一些的可以考虑查找表或者chain of responsibility方式(类似validator的设计).

当然你一定要说非常复杂的情况,那么规则引擎,状态机就是用来干这个的。

 回复 引用 查看   
2007-07-29 01:17 | lain[未注册用户]
可以使用类似IoC的概念,通过在WEBCONFIG文件中添加节点设置具体需要实例化的类名,然后通过反射的方式来实例化具体需要的类,这样就不用在使用工厂模式的情况下去写那么多条件语句了。。而且现在硬件条件一般都不错,反射的效率不会低到哪去。。
 回复 引用   
2007-08-28 13:28 | aa[未注册用户]
11
 回复 引用   
昵称:代震军
园龄:5年11个月
荣誉:推荐博客
粉丝:492
关注:3

<2007年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

搜索

 
 

常用链接

随笔分类(366)

随笔档案(283)

文章分类(8)

文章档案(31)

相册

JavaScript

LINQ

silverlight

UML,OO

WebBlogger

负载开源项目

  • Discuz!NT
  • LLServer
  • TokyoTyrantClient
  • WebCam

个人简历

漫画

其它

企业级架构

网站案例研究

积分与排名

  • 积分 - 1217876
  • 排名 - 26

最新评论

阅读排行榜

评论排行榜

推荐排行榜