用工厂方法替换构造函数
问题
你有一个复杂的构造函数,它所做的不仅仅是在对象字段中设置参数值。
解决方案
创建一个工厂方法并使用它来替换构造函数调用。
之前
类雇员{雇员(int类型){这个。类型=类型;} //…}
后
类雇员{静态雇员创建(int类型){雇员=新雇员(类型);//做一些繁重的工作。返回的员工;} //…}
之前
公共类雇员{公共雇员(int类型){this。类型=类型;} //…}
后
创建(int类型){Employee =新雇员(类型);//做一些繁重的工作。返回的员工;} //…}
之前
类Employee{//…公共函数__construct($type) {$this->type = $type;} //…}
后
类Employee{//…static public函数create($type) {$employee = new employee ($type);//做一些繁重的工作。返回$员工;} //…}
之前
类雇员{构造函数(类型:数字){this。类型=类型;} //…}
后
class Employee {static create(type: number): Employee {let Employee = new Employee(type);//做一些繁重的工作。返回的员工;} //…}
为什么重构
使用这种重构技术的最明显的原因是用子类替换类型代码.
在您的代码中,之前创建了一个对象,并将编码类型的值传递给它。在使用重构方法之后,出现了几个子类,您需要根据编码类型的值从它们创建对象。更改原始构造函数以使其返回子类对象是不可能的,因此我们创建了一个静态工厂方法,该方法将返回必要类的对象,之后它将替换对原始构造函数的所有调用。
当构造函数无法胜任任务时,工厂方法也可以用于其他情况。在尝试的时候,它们可能很重要将值更改为Reference.它们还可以用于设置超出参数数量和类型的各种创建模式。
好处
工厂方法不一定返回调用它的类的对象。这些通常可以是它的子类,根据给方法的参数选择。
例如,工厂方法可以有一个更好的名称来描述它做什么以及如何返回它所做的事情
军队:GetCrew (myTank)
.工厂方法可以返回一个已经创建的对象,不像构造函数总是创建一个新实例。
如何重构
创建一个工厂方法。对其中的当前构造函数进行调用。
将所有构造函数调用替换为对工厂方法的调用。
将构造函数声明为私有。
研究构造函数代码,并尝试分离与构造当前类的对象没有直接关系的代码,将此类代码移到工厂方法。