提取工厂类

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

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

如下代码所示,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);
        }
    }
}

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

版权声明:本文为博主http://www.zuiniusn.com原创文章,未经博主允许不得转载。

时间: 2024-08-19 15:39:14

提取工厂类的相关文章

小酌重构系列[17]——提取工厂类

概述 在程序中创建对象,并设置对象的属性,是我们长干的事儿.当创建对象需要大量的重复代码时,代码看起来就不那么优雅了.从类的职责角度出发,业务类既要实现一定的逻辑,还要负责对象的创建,业务类干的事儿也忒多了点.对象创建也是"一件事",我们可以将"这件事"从业务代码中提取出来,让专门的类去做"这件事",这个专门的类一般是"工厂类",这样使得业务类和工厂类各司其职,代码整洁性得以提高.这就是本文要讲的主题--提取工厂类. 工厂举例

重构第19天 提取工厂类(Extract Factory Class)

理解:本文中的“提取工厂类”是指如果要创建的对象很多,则代码会变的很复杂.一种很好的方法就是提取工厂类. 详解:一般来说我们需要在代码中设置一些对象,以便获得它们的状态,从而使用对象,所谓的设置通常来说就是创建对象的实例并调用对象的方法.有时如果要创建的对象很多,则代码会变的很复杂.这便是工厂模式发挥作用的情形.工厂模式的复杂应用是使用抽象工厂创建对象集,但我们在这里只是使用基本的工厂类创建对象的一个简单应用. 重构前代码: 1 public class PoliceCarController

重构19-Extract Factory Class(提取工厂类)

在代码中,通常需要一些复杂的对象创建工作,以使这些对象达到一种可以使用的状态.通常情况下,这种创建不过是新建对象实例,并以我们需要的方式进行工作.但是,有时候这种创建对象的需求会极具增长,并且混淆了创建对象的原始代码.这时,工厂类就派上用场了.关于工厂模式更全面的描述可以参考这里.最复杂的工厂模式是使用抽象工厂创建对象族.而我们只是使用最基本的方式,用一个工厂类创建一个特殊类的实例.来看下面的代码: public class PoliceCarController { public Police

【Faster RCNN】建立数据集工厂类,并注册数据集类

在Faster RCNN中,首先使用基类imdbs创建一个工厂类.然后建立自己的具体数据集的类. 然后可以将类当做为函数,使用lambda方法进行调用实例化. 在这里,我们讲解一下lambda方法: var = (lamdba para1,para2 = func(para1,para2)) 其中,var变量存储的不是func的返回.而是func本身,如果我们输出var: print(var) #<function <lambda> at 0x000001B46BF97C80> 而

工厂类分离与java反射机制

网易 博客 发现 小组 风格 手机博客 玩LOFTER,免费冲印20张照片!> 创建博客登录 加关注 黙言-在路上 奋斗 首页 日志 相册 音乐 收藏 博友 关于我 黙言 加博友   关注他 他的网易微博 最新日志 Javascript 操作select控件 Oracle 存储过程基本语法 将域名和tomcat6进行绑定的 svn 423 Locked JS的trim()方法 jbpm4.4 结束流程时报错 随机阅读 让员工每年有一次机会当主角 外国女性如何舍身"套"色狼 亚洲电

2)小案例步骤2,添加工厂类

和上面的思路一样,只不过稍加改进的是加了工厂类,来实例化数据库对象 框图展示: 代码展示: 只是在zixun.controller.class.php                               发生了代码改动: 1 <?php 2 //header('Content-type:text/html;charset=utf8'); 3 /** 4 * Created by PhpStorm. 5 * User: Interact 6 * Date: 2017/8/19 7 * Ti

hibernate 创建工厂类

package cn.hibernate; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; /** * 创建一个工厂类 用于创建SessionFactory唯一的一个 */ public class SessionFactoryUtils { private static SessionFactory sessionFactory; // 在静态的代码块中创建这个对象 static { //

java工厂类与反射机制

java 简单工厂类 2012-04-22 15:44:07|  分类: java |  标签:java工厂类  简单工厂类  |举报|字号 订阅 简单工厂模式需要由以下角色组成: 接口                        接口的实现类(简单工厂模式里面的具体产品角色)                        工厂注意对比以下三个实例的不同实例1: package org.jzkangta.factorydemo01;//定义接口interface Car{    public 

Android 采用工厂类创建对话框

代码复用很重要!对话框除了内容不同外,显示样式相同,我们就要建立一个工厂类. public class DialogFactory { public static Dialog creatRequestDialog(final Context context, String tip) { final Dialog dialog = new Dialog(context, R.style.dialog); dialog.setContentView(R.layout.dialog_layout);