当前位置: 代码网 > it编程>编程语言>Asp.net > .Net创建型设计模式之简单工厂模式(Simple Factory)

.Net创建型设计模式之简单工厂模式(Simple Factory)

2024年05月15日 Asp.net 我要评论
简单工厂模式(simple factory pattern)属于类的创建型模式,又叫静态工厂方法模式(static factorymethod pattern)是通过专门定义一个类来负责创建其他类的实

简单工厂模式(simple factory pattern)属于类的创建型模式,又叫静态工厂方法模式(static factorymethod pattern)

是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

这个模式并不属于gof23里面的设计模式,其实他属于一个过渡的模式,这个模式是为了引出下一篇要将的模式:工厂模式。

一、uml图

简单工厂模式解决的问题是如何去实例化一个合适的对象。

简单工厂模式的核心思想就是:有一个专门的类来负责创建实例的过程。具体来说,把产品看着是一系列的类的集合,这些类是由某个抽象类或者接口派生出来的一个对象树。而工厂类用来产生一个合适的对象来满足客户的要求。

二、简单工厂模式的代码实现

public static operation createoperate(string operate)
{
    operation oper = null;
    switch (operate)
    {
        case "+":
            {
                oper = new operationadd();
                break;
            }
        case "-":
            {
                oper = new operationsub();
                break;
            }
        case "*":
            {
                oper = new operationmul();
                break;
            }
        case "/":
            {
                oper = new operationdiv();
                break;
            }
    }
    return oper;
}

三、优缺点分析:

优点:客户端不需要修改代码。
缺点: 当需要增加新的运算类的时候,不仅需新加运算类,还要修改工厂类,违反了开闭原则。

四、.net中简单工厂模式的实现

介绍完了简单工厂模式之后,.net类库中也有类似的实现,net中system.text.encoding类就实现了简单工厂模式,该类中的getencoding(int codepage)就是工厂方法具体的代码可以通过reflector反编译工具进行查看

.net 中encoding的uml图为:

encoding类中实现的简单工厂模式是简单工厂模式的一种演变,此时简单工厂类由抽象产品角色扮演,然而.net中encoding类是如何解决简单工厂模式中存在的问题的呢(即如果新添加一种编码怎么办)?在getencoding方法里的switch函数有如下代码:

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

在getencodingrare方法里有一些不常用编码的实例化代码,微软正式通过这个方法来解决新增加一种编码的问题。(其实也就是列出所有可能的编码情况),微软之所以以这样的方式来解决这个问题,可能是由于现在编码已经稳定了,添加新编码的可能性比较低,所以在.net 4.5仍然未改动这部分代码。

到此这篇关于.net设计模式之简单工厂模式(simple factory)的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com