zoukankan      html  css  js  c++  java
  • 重构19-Extract Factory Class(提取工厂类)

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

    public class PoliceCarController {
    public PoliceCar New(int mileage, Boolean serviceRequired) {
    PoliceCar policeCar = new PoliceCar();
    policeCar.ServiceRequired = serviceRequired;
    policeCar.Mileage = mileage;
    return policeCar;
    }
    }
    如您所见,New方法负责创建PoliceCar并根据一些外部输入初始化PoliceCar的某些属性。对于简单的创建工作来说,这样做可以从容应对。但是久而久之,创建的工作量越来越大,并且被附加在controller类上,但这并不是controller类的职责。这时,我们可以将创建代码提取到一个Factory类中去,由该类负责PoliceCar实例的创建。
    public interface IPoliceCarFactory {
    PoliceCar Create(int mileage, Boolean serviceRequired);
    }
    public class PoliceCarFactory extends IPoliceCarFactory {
    @Override
    public PoliceCar Create(int mileage, Boolean serviceRequired) {
    PoliceCar policeCar = new PoliceCar();
    policeCar.ReadForService = serviceRequired;
    policeCar.Mileage = mileage;
    return policeCar;
    }
    }
    public class PoliceCarController {
    public IPoliceCarFactory PoliceCarFactory;//getter setter
    public PoliceCarController(IPoliceCarFactory policeCarFactory) {
    PoliceCarFactory = policeCarFactory;
    }
    public PoliceCar New(int mileage, Boolean serviceRequired) {
    return PoliceCarFactory.Create(mileage, serviceRequired);
    }
    }
    由于将创建的逻辑转移到了工厂中,我们可以添加一个类来专门负责实例的创建,而不必担心在创建或复制代码的过程中有所遗漏。





  • 相关阅读:
    PAT 天梯赛 L2-003. 月饼 【贪心】
    PAT 天梯赛 L2-015. 互评成绩 【排序】
    PAT 天梯赛 L1-046. 整除光棍 【模拟除法】
    PAT 天梯赛 L1-006. 连续因子 【循环】
    PAT 天梯赛 L1-009. N个数求和 【模拟】
    HackerRank
    ZOJ 3961 Let's Chat 【水】
    ZOJ 3960 What Kind of Friends Are You? 【状态标记】
    ZOJ 3959 Problem Preparation 【水】
    ZOJ 3958 Cooking Competition 【水】
  • 原文地址:https://www.cnblogs.com/jgig11/p/5786344.html
Copyright © 2011-2022 走看看