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

 

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

例如以下代码所看到的。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方法变得非常easy了,指须要调用实现接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);
        }
    }
}

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