zoukankan      html  css  js  c++  java
  • 31天重构学习笔记19. 提取工厂类

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

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

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

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

  • 相关阅读:
    Java并发之ThreadPoolExecutor
    Java并发之同步工具类
    em和i , b和Strong 的区别
    OS应用架构谈(二):View层的组织和调用方案(中)
    iOS应用架构谈(二):View层的组织和调用方案(上)
    java(List或Array数组)求交集、并集、差集, 泛型工具类
    AES/DES 可逆性加密算法 -- java工具类
    用xtrabackup实现mysql的主从复制 阿里云rds到自己创建mysql
    java 生成二维码工具
    XDU 1022 (数论筛法+前缀和)
  • 原文地址:https://www.cnblogs.com/ywsoftware/p/2892607.html
Copyright © 2011-2022 走看看