在 PHP 的编程过程中,我们经常需要创建对象。面向对象的程序设计中,我们使用类来创建对象,调用类中的方法来实现对象所需的操作。类中的构造函数在对象创建时进行初始化。如果我们在程序中需要经常创建对象,直接写类的实例化代码会显得臃肿而且不易于维护。
简单工厂模式通过将实例化对象的代码封装到一个工厂类中,使得我们在使用时只需要调用工厂类的方法即可得到所需的对象,提高了代码的可重用性。
1. 简单工厂模式介绍
简单工厂模式(Simple Factory Pattern)是指由一个工厂类根据传入的参数决定创建出哪一种产品类的实例。对于工厂类而言,它并不需要知道具体产品类中的细节,只需要知道产品类接口所提供的方法即可。
简单工厂模式是工厂模式的种类之一,它的结构简单,通常只需要一个工厂类、一个抽象产品类和多个具体产品类即可实现。相比于其他工厂模式,它更加灵活,虽然具体产品类的增删需要修改工厂类代码,但是该模式在小型项目中应用广泛。
2. 简单工厂模式实现
以下将介绍一个简单的示例,通过一个运算工厂类来创建不同的运算对象。
首先,我们需要提供一个接口类来规定运算对象具备的方法。在本例中,我们实现一个 Operation 接口类,该接口类有两个方法:get_result 和 set_value。
interface Operation {
public function get_result();
public function set_value($value1, $value2);
}
然后,我们需要提供三个具体的运算类,这里我们通过继承 Operation 接口类来实现。这三个具体类分别是 AddOperation、SubOperation 和 MulOperation,分别实现相加、相减和相乘操作。
AddOperation 类代码如下:
class AddOperation implements Operation {
public function get_result() {
return $this->value1 + $this->value2;
}
public function set_value($value1, $value2) {
$this->value1 = $value1;
$this->value2 = $value2;
}
}
SubOperation 类代码如下:
class SubOperation implements Operation {
public function get_result() {
return $this->value1 - $this->value2;
}
public function set_value($value1, $value2) {
$this->value1 = $value1;
$this->value2 = $value2;
}
}
MulOperation 类代码如下:
class MulOperation implements Operation {
public function get_result() {
return $this->value1 * $this->value2;
}
public function set_value($value1, $value2) {
$this->value1 = $value1;
$this->value2 = $value2;
}
}
最后,我们提供一个运算工厂类 CalculatorFactory,根据传入的类型参数实例化不同的运算类。
class CalculatorFactory {
public static function create_operation($type) {
switch ($type) {
case '+':
return new AddOperation();
case '-':
return new SubOperation();
case '*':
return new MulOperation();
default:
throw new Exception('Operation not supported');
}
}
}
3. 客户端使用简单工厂模式
在客户端中使用简单工厂模式只需要调用工厂类的 create_operation 方法即可创建运算对象,同时也可以调用运算对象提供的方法来执行具体的运算操作。
$operation = CalculatorFactory::create_operation('+');
$operation->set_value(2, 3); // 设置运算对象参数
$result = $operation->get_result(); // 获取运算结果
3.1. 代码演示
以下是代码演示的完整代码:
interface Operation {
public function get_result();
public function set_value($value1, $value2);
}
class AddOperation implements Operation {
private $value1 = 0;
private $value2 = 0;
public function get_result() {
return $this->value1 + $this->value2;
}
public function set_value($value1, $value2) {
$this->value1 = $value1;
$this->value2 = $value2;
}
}
class SubOperation implements Operation {
private $value1 = 0;
private $value2 = 0;
public function get_result() {
return $this->value1 - $this->value2;
}
public function set_value($value1, $value2) {
$this->value1 = $value1;
$this->value2 = $value2;
}
}
class MulOperation implements Operation {
private $value1 = 0;
private $value2 = 0;
public function get_result() {
return $this->value1 * $this->value2;
}
public function set_value($value1, $value2) {
$this->value1 = $value1;
$this->value2 = $value2;
}
}
class CalculatorFactory {
public static function create_operation($type) {
switch ($type) {
case '+':
return new AddOperation();
case '-':
return new SubOperation();
case '*':
return new MulOperation();
default:
throw new Exception('Operation not supported');
}
}
}
// 客户端应用
$operation = CalculatorFactory::create_operation('+');
$operation->set_value(2, 3);
$result = $operation->get_result();
echo $result; // 输出 5
4. 总结
简单工厂模式是一种灵活、简单、易于维护的工厂模式,尤其适用于小型项目。通过将对象的创建过程封装到一个工厂类中,我们可以将对象的实例化代码解耦出来,减少代码的重复、提高可重用性。同时,工厂类可以隐藏实例化对象的细节,客户端只需要关心使用即可,降低了客户端与具体类的耦合度。