概念:本文中的“提取工厂类”是指如果要创建的对象很多,则代码会变的很复杂。一种很好的方法就是提取工厂类。

正文:一般来说我们需要在代码中设置一些对象,以便获得它们的状态,从而使用对象,所谓的设置通常来说就是创建对象的实例并调用对象的方法。有时如果要创建的对象很多,则代码会变的很复杂。这便是工厂模式发挥作用的情形。工厂模式的复杂应用是使用抽象工厂创建对象集,但我们在这里只是使用基本的工厂类创建对象的一个简单应用。

如下代码所示,New方法包含创建类的整个逻辑,如果现在要创建的类比较多而且逻辑比较复杂的话(如根据不同条件创建对象,什么时候创建对象),我们的New方法逻辑会变得很大,同时代码也变得很难维护。所以我们就会采用提取工厂类的方式进行提炼。

namespace LosTechies.DaysOfRefactoring.ExtractServiceClass.Before 

    public class PoliceCarController 
   { 
        public PoliceCar New(int mileage, bool serviceRequired) 
        { 
            PoliceCar policeCar = new PoliceCar(); 
            policeCar.ServiceRequired = serviceRequired; 
            policeCar.Mileage = mileage;

return policeCar; 
        } 
    } 
}

那么重构后的代码如下,New方法变得很简单了,指需要调用实现接IPoliceCarFactory 接口的PoliceCarFactory 类就可以返回对象,这样就隔开了创建对象的逻辑,如果需求现在变为根据不同的条件创建不同的对象,什么时候创建对象等都变成了比较简单的事情,在后期可以把对象都配置在XML里面,使用反射的方式实现IOC注入创建。

namespace LosTechies.DaysOfRefactoring.ExtractServiceClass.After{public interface IPoliceCarFactory{        PoliceCar Create(int mileage, bool serviceRequired);    }

public class PoliceCarFactory : IPoliceCarFactory{public PoliceCar Create(int mileage, bool serviceRequired)        {            PoliceCar policeCar = new PoliceCar();            policeCar.ReadForService = serviceRequired;            policeCar.Mileage = mileage;return policeCar;        }    }

public class PoliceCarController{public IPoliceCarFactory PoliceCarFactory { get; set; }

public PoliceCarController(IPoliceCarFactory policeCarFactory)        {            PoliceCarFactory = policeCarFactory;        }

public PoliceCar New(int mileage, bool serviceRequired)        {return PoliceCarFactory.Create(mileage, serviceRequired);        }    }}

总结:这个重构经常会在项目中使用,如果要创建的对象是一个,你可以采用简单工厂,但是这种方式还是会存在很多依赖,维护起来也比较不方便。所以推荐使用工厂方法模式,把实例化延迟到子类。如果你要创建一系列的对象,那么就推荐你使用抽象工厂模式,但是要注意不要过度设计,只要能满足不断变化的需求和给以后的维护和重构带来方便即可。

转载于:https://www.cnblogs.com/ywsoftware/archive/2013/02/05/2892607.html

31天重构学习笔记19. 提取工厂类相关推荐

  1. 31 天重构学习笔记9. 提取接口

    摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链接 ...

  2. 31天重构学习笔记17. 提取父类

    概念:本文中的"提取父类"是指类中有一些字段或方法,你想把它们提取到父类中以便同一继承层次的其它类也可以访问他们,这个和之前的很多重构有异曲同工之处. 正文:Dog 类中的EatF ...

  3. 31 天重构学习笔记索引

    由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链接过去的 ...

  4. 31天重构学习笔记下载

    前言 前两天写了一篇程序猿也爱学英语(上),有图有真相的文章,写作那篇文章只是自己一时兴起,或者说是自己的兴趣使然.文中的观点只是自己的学习心得和体会,属一家之言且鉴于本人不是学英语出身,所以也肯定有 ...

  5. 31 天重构学习笔记28. 为布尔方法命名

    摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年 10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链 ...

  6. 31 天重构学习笔记5. 提升字段

    摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链接 ...

  7. 31 天重构学习笔记29. 去除中间人对象

    摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年 10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链 ...

  8. 31天重构学习笔记3. 提升方法

    摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链接 ...

  9. 31 天重构学习笔记14. 分离职责

    摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有 订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链 ...

最新文章

  1. 六种方式,教你在SpringBoot初始化时搞点事情!
  2. 性能压测诡异的Requests/second 响应刺尖问题
  3. C++ 中 string earse 函数的使用
  4. IFE-16 addEventHandler跨浏览器实现事件绑定
  5. forward_list的insert操作
  6. java中的gui_java gui快速入门教程
  7. python训练的模型怎么在C++使用?
  8. node 后台文章编辑器_我如何使用Node从报纸网站上刮掉7000篇文章
  9. class括号里的object_使用es5和es6实现继承详解以及class的基本使用
  10. InnoDB存储引擎:锁
  11. 西门子/软件/S7-300.400/simatic step 7 v5.5 sp4 chinese
  12. Android代码中设置横屏
  13. 如何查看一个网页源代码的最后更新时间
  14. 数据洞察医药电商,解析医药电商行业现状及发展趋势
  15. php eval 引号,PHP手册-eval()(可以将单引号中的变量解析)
  16. 什么是管理者的有用功
  17. 别只关注chatGPT能不能写论文了,它还支持49中场景,代码都给你写好了,速领
  18. java毕业设计阿博图书馆管理系统(附源码、数据库)
  19. 【包管理器】vcpkg
  20. powershell配置anaconda及解决【无法加载文件C:\Users\xxx\Documents\WindowsPowerShell\profile.ps1,因为在此系统上禁止运行脚本】的问题

热门文章

  1. WPF中StringToImage和BoolToImage简单用法
  2. 转: Div与table的区别
  3. Spring Thread Pool 线程池的应用
  4. 自制“低奢内”CSS3登入表单,包含JS验证,请别嫌弃哦。
  5. WPF 用 DataTemplate 合并DataGrid列表列头类似报表设计及行头列头样式 - 学习
  6. asp.net生成jason给js
  7. 全国计算机等级考试题库二级C操作题100套(第83套)
  8. Ubuntu磁盘扩容及启动问题整理
  9. 用python做数据分析pdf_利用python进行数据分析pdf
  10. mysql strtok_c函数: strtok 和 strtok_r 详解