zoukankan      html  css  js  c++  java
  • .NET 框架中的 Factory 模式

    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;
    
    ......

    基本上对框架中主要的编码都有声明。目前根据我的理解只是为了方便使用才这样安排的。

  • 相关阅读:
    弹出的iframe 表单无法获取焦点
    记录IE的两则BUG
    manifest 在移动端的应用实验
    [hover 状态图片变小] 淘宝的一个小用户体验
    使用 JSONP 的几点注意
    Apple在线商店iphone5, ipad mini到货提醒 邮件
    关于弹窗中的事件多次执行
    zen coding 插件使用实践
    hadoop系列整理Spark
    hadoop系列整理HBase
  • 原文地址:https://www.cnblogs.com/masahiro/p/10131722.html
Copyright © 2011-2022 走看看