• 简单工厂的来世今生


        今天,和一哥们讨论到简单工厂,正好我也对此关注了很长时间,所以有感而发,写点东西,供以后回味这段历史。
        

        简单工厂的用途在现代语言(具有运行时强类型系统支持的语言,如Java,.Net),确实用途不大,感觉不到想起他模式一样重要,但是在不具备运行时强类型系统支持的语言(如C/C++等,C++具有编译时的强类型,运行时没有),这是一个极其重要的模式。
        比如一个简单的需求,我需要根据一个名称来确定最终使用的实现,如数据库的连接
        IConnect <--SqlConnect
                       <-OracalConnect
                       <-......
        我需要在配置文件里确定最终使用哪个。
        在现代语言里,可以直接存储一个类型名,运行时可以使用这个名字反射到类型,然后用类型反射出具体的实例
        如下所示,用类似C#的代码描述,假设配置文件里有如下配置:
        <appSettings>
        <add key="ConnectType" value="OracalConnect"/>
        </appSettings>
        在程序里如下代码即可实现具体连接的选择:
        Type t=Type.GetType(ApplicationSetting["ConnectType"]);
        IConnect con=Activitor.CreateInstance(t) as IConnect;
        DoSomeThing(con);
      

         但是,在以前的语言里,运行系统里没有"类型"这么一个概念,更加没有"反射"的概念,这时候,简单工厂就基本上成了必须的模式了,只能老老实实地手动写一个简单工厂,大概如下:
         class ConnectFac
         {
                  public:
                  static IConnect* CreateConnect(string type)
                  {
                       if(type=="SqlConnect")return new SqlConnect();
                        if(type=="OracalConnect")return new OracalConnect();
                        return NULL;
                  }
         }
         然后再程序里如下,可以完成全面等同的功能
                 point_ptr<IConnect*> con= CreateConnect(ApplicationSetting["ConnectType"]);
                 DoSomeThing(con);
        
         所以,正如GOF中的Flower所说,语言在进步,很多模式已经集成到语言本身里面,成了语言的一部分。
        

         我的结论是:工厂方法很有用,但在现代语言里,没有必要手工去实现了,但偶尔还是用得上的:)

  • 相关阅读:
    [译]在Python中如何使用额enumerate 和 zip 来迭代两个列表和它们的index?
    [译]如何去除Git的unstaged的文件提示“old mode 100755 new mode 100644”?
    [译]在SQL查询中如何映射(替换)查询的结果?
    [总结]《敏捷软件开发: 原则、模式与实践》一次编程实践
    [书摘]《敏捷软件开发: 原则、模式与实践》第一部分:敏捷开发
    [译]Python
    [问题解决]Python locale error: unsupported locale setting
    [持续补充]开发过程中常见bug查找思路
    [译]如何比较同一分支上的不同commit的代码区别?
    [整理]如何切换到远程分支
  • 原文地址:https://www.cnblogs.com/stst/p/4908547.html
Copyright © 2020-2023  润新知