2019独角兽企业重金招聘Python工程师标准>>>

类中有多个构造函数,因此很难决定在开发期间调用哪一个。用能够说明意图的返回对象实例的Creation Method替换构造函数。

做法:
1、找出通过调用类的构造函数来创建实例的那个客户代码。对构造函数调用应用提炼方法重构,生成一个公共、静态的方法。这个新方法就是一个Creation Method。然后,应用搬移方法重构将Creation Method搬移到包括所选构造函数的类中。
2、找出调用所选构造函数类创建实例的所有代码,将它们更新为调用Creation Method。
3、如果所选构造函数链接到另一个构造函数,应该让Creation Method调用被链接的构造函数而不是所选构造函数。
4、对类中每个要转为构建方法的构造函数重复步骤1-3。
5、如果类中的某个构造函数在类外无调用,将它改为非公共的。
public class Person {private String name;private String phone;private String car;private String house;public Person(String name, String phone, String house, String car){this.name = name;this.phone = phone;this.house = house;this.car = car;}public Person(String name){this(name, null, null, null);}public Person(String name, String phone){this(name, phone, null, null);}public Person(String name, String phone, String car){this(name, phone, car, null);}
}

我们在使用Person类的时候,会创建这几类人:有房有车有电话、没房有车有电话、没房没车有电话,只有电话、什么都没有的人。单单的一个Person构造函数无法表达清楚我们的这些需求。

public class Person {private String name;private String phone;private String car;private String house;private Person(String name, String phone, String house, String car){this.name = name;this.phone = phone;this.house = house;this.car = car;}public static Person createPoorPerson(String name){return new Person(name, null, null, null);}public static Person createPersonWithPhone(String name, String phone){return new Person(name, phone, null, null);}public static Person createPersonWithPhoneCar(String name, String phone, String car){return new Person(name, phone, null, car);}public static Person createRichPerson(String name, String phone, String house, String car){return new Person(name, phone, house, car);}
}
Person poor = Person.createPoorPerson("aqia");Person rich = Person.createRichPerson("aqia", "1511510000", "house", "car");
优点:Creation Method没有命名限制,可以取一些能够清晰表达所创建的对象性质的名字。这种命名上的灵活性意味着两个名字不同的Creation Method可以接受数量和类型相同的参数。对于缺乏现代开发环境的程序员来说,寻找死Creation Method代码通常比寻找死构造函数代码要容易,因为搜索特殊名字方法的表达式,比搜索一组构造函数中的一个,要好写得多。
缺点:可能引入非标准得创建创建方式。如果大多数类都使用new实例化对象,而有些却使用一个Creation Method,那么程序员就必须了解每个类的创建使怎样完成的。

转载于:https://my.oschina.net/u/1182234/blog/163729

【重构与模式】6.1用Creation Method替换构造函数相关推荐

  1. 重构与模式:改善代码三部曲中的第三部

    一.改善代码的三部曲 <设计模式>-> <重构>-> <重构与模式>.也就是设计->重构->重构出新设计. <设计模式>主要详细 ...

  2. 《重构与模式(修订版)》目录—导读

    版权声明 重构与模式(修订版) Authorized translation from the English language edition, entitled: Refactoring to P ...

  3. 重构是提高可测试性的主要手段 《设计模式》《代码重构》《从重构到模式》 《反模式》 重构时机 编写测试时候 修改BUG时候

    l重构是提高可测试性的主要手段 <设计模式><代码重构><从重构到模式> <反模式> 重构时机 编写测试时候 修改BUG时候

  4. 设计模式学习(六):重构与模式,推荐书籍(完)

    备注: 1.        模式常常组合使用,共同解决问题. 2.        模式是特定场景下优雅的解决方案,因此场景很关键.在软件设计中,特定的场景可能是显而易见的,可能是隐而不现的,有时甚至是 ...

  5. 用python重构策略模式

    资料来源:<流畅的Python> 案例分析:重构"策略"模式 <设计模式:可复用面向对象软件的基础>一书是这样概述"策略"模式的: 定义 ...

  6. modern android5.1,Modern版IT之家v5.1.1更新:ARM版重构+横屏模式修复

    Win7之家( www.win7china.com):Modern版IT之家v5.1.1更新:ARM版重构+横屏模式修复 2月27日,Win8.1/Win10版IT之家v5.1.1携多项重磅改进及新特 ...

  7. Factory Method模式的误区:Factory Method模式是简化版的Abstract Factory吗?

    FactoryMethod是一个相对比较简单的创建型模式,但是能领悟或者用对的并不多见:很多示例都没有反应出Factory Method的核心思想,只是实现了一个简化版的Abstract Factor ...

  8. 步步为营,重构出模式(2)

    上回说到Command的雏形被高手改过之后,高手让我再对代码进行一下重构和完善,并且还特意嘱咐不要出现那么多的字符串.饿滴神啊,该怎么办呢? 外事不决问Google,果然,有办法了: 我用一个配置文件 ...

  9. 西行漫记(15):重构到模式

    今天的问题有点意思:我们有停车场(ParkingLot),还有停车小弟(Attendant).一个停车小弟要管理多个停车场,然后帮客人把车子泊到有空位的停车场去.然后老板说了,要有不同的策略来选择停车 ...

  10. 优秀代码---改善代码三部曲:重构、设计模式、重构与模式

        重构是术,设计是道: 前言 1.好代码的特点 好代码就像 玩笑无需解释. •内聚Cohesive:  内聚的代码更容易理解和查找 bug • 松耦合Loosely Coupled:  松耦合的 ...

最新文章

  1. Java并发编程 Synchronized及其实现原理
  2. OpenCV相机校准camera calibration的实例(附完整代码)
  3. shell 删除奇数偶数行
  4. php 正则获取html标签,php正则取嵌套html标签
  5. mysql 查询某个字段SQL语句【mysql语句】
  6. 自动化代码部署、代码回滚、命令执行软件之capistrano
  7. php 抽象类,接口,抽象方法,静态方法
  8. SQL语句优化技术分析 整理他人的
  9. 搜狗输入法linux版怎么安装,Linux 搜狗输入法的安装(Ubuntu版)
  10. python小游戏贪吃蛇下载_python实现贪吃蛇小游戏
  11. maven报错The forked VM terminated without saying properly goodbye. VM crash or System.exit called
  12. 计算机组成原理全书知识总结
  13. 64Mbit SOIC8封装SPI接口的国产串行SRAM EMI7064
  14. 项目案例:吃货联盟,订餐系统
  15. android stdudio OpenCV NDK 开发环境搭建 之找查条形码
  16. 前端之vue3使用动画库animate.css(含动画、过渡)
  17. Gradle sync failed: Could not find xxxx.xx 之 强制刷新Gradle dependencies
  18. 如何理解3D动画中的欧拉角以及死锁?
  19. 设计高质量的论文插图
  20. 键盘上各种符号的英文名称与发音

热门文章

  1. java9新特性有json吗,磨剑三年,跳票一年,Java9新功能有哪些神通?
  2. f5 会话保持 负载均衡_f5会话保持的.doc
  3. 项目-字典-更新字典分组
  4. 获取代理电脑的https证书方法
  5. Hadoop工具让数据仓库迁移更轻松
  6. 从零到实现Shiro中Authorization和Authentication的缓存
  7. [转]虚方法(virtual)和抽象方法(abstract)的区别
  8. Windows7中被大家忽略的实用七大功能
  9. UBNT Bullet M2说明书
  10. 反转链表详解(Python)