简单工厂模式简介
简单工厂模式(Simple Factory Pattern)是一种实现对象创建的设计模式,它属于创建型模式。简单工厂模式提供了一种统一的方式来创建对象,而无需直接暴露对象的创建逻辑,从而使客户端可以更加方便地使用对象。
下面,我们来介绍如何使用PHP面向对象简单工厂模式创建可测试的对象实例。
创建可测试的对象实例
步骤一:定义工厂类
在简单工厂模式中,我们需要定义一个工厂类,在该类中提供一个静态方法,用于根据输入的参数,创建相应的对象实例。
class ObjectFactory {
public static function create($type) {
switch ($type) {
case 'Type1':
return new Type1();
break;
case 'Type2':
return new Type2();
break;
default:
throw new Exception("Invalid type");
}
}
}
在上述代码中,我们定义了一个静态方法create,该方法接受一个字符串类型的参数type。在该方法中,我们使用switch语句根据输入的参数确定要创建的对象类型。如果输入的参数是Type1,则创建一个Type1对象并返回,如果是Type2,则创建一个Type2对象并返回,否则抛出一个异常。
步骤二:创建对象类
在创建对象之前,我们需要先定义对象类。这里我们以Type1和Type2两个类为例。
class Type1 {
public function getType() {
return 'Type1';
}
}
class Type2 {
public function getType() {
return 'Type2';
}
}
在上述代码中,我们分别定义了Type1和Type2两个类,每个类中都有一个getType方法,用于返回各自的类型名称。
步骤三:使用工厂创建对象实例
通过工厂创建对象实例,可以更加方便地管理对象的创建过程,并且可以提高代码的复用性。
$obj1 = ObjectFactory::create('Type1');
$obj2 = ObjectFactory::create('Type2');
echo $obj1->getType(); // 输出 "Type1"
echo $obj2->getType(); // 输出 "Type2"
上述代码中,我们分别使用工厂类中的create方法,创建了一个Type1对象和一个Type2对象,并分别调用getType方法获取类型名称并输出。
实现可测试的对象实例
步骤一:定义抽象类
为了实现可测试的对象实例,我们需要定义一个抽象类,该抽象类中包含了对象中需要测试的方法。
abstract class MyObject {
abstract function doSomething($param);
}
在上述代码中,我们定义了一个抽象类MyObject,该类中包含了一个抽象方法doSomething,方法中接受一个参数$param。
步骤二:创建继承自抽象类的子类
在创建可测试的对象实例中,我们需要使用继承,创建继承自抽象类MyObject的子类。
class Object1 extends MyObject {
public function doSomething($param) {
$result = $param + 10;
return $result;
}
}
class Object2 extends MyObject {
public function doSomething($param) {
$result = $param + 20;
return $result;
}
}
在上述代码中,我们创建了两个继承自抽象类MyObject的子类,分别是Object1和Object2。在每个子类中,我们重写了父类中的doSomething方法,实现了子类的功能。
步骤三:使用工厂类创建对象实例
为了更好地实现可测试的对象实例,我们需要使用工厂类来创建对象实例,在工厂类中创建对象实例时,传递参数为子类名称。
class ObjectFactory {
public static function create($type) {
switch ($type) {
case 'Object1':
return new Object1();
break;
case 'Object2':
return new Object2();
break;
default:
throw new Exception("Invalid type");
}
}
}
在上述代码中,我们定义了一个静态方法create,在该方法中根据传入的参数type,判断应该创建哪个对象实例。
步骤四:测试对象实例
在创建对象实例之后,我们需要对对象实例进行测试,测试方法如下:
class MyObjectTest extends PHPUnit_Framework_TestCase {
public function testObject1() {
$object = ObjectFactory::create('Object1');
$result = $object->doSomething(5);
$this->assertEquals($result, 15);
}
public function testObject2() {
$object = ObjectFactory::create('Object2');
$result = $object->doSomething(5);
$this->assertEquals($result, 25);
}
}
在上述代码中,我们定义了一个测试类MyObjectTest,在该测试类中,我们定义了两个测试方法testObject1和testObject2,分别用于测试Object1和Object2两个对象实例。
在每个测试方法中,我们首先使用工厂类ObjectFactory创建一个对象实例,然后调用对象实例中的方法doSomething来测试对象的功能。在测试方法中,我们使用PHPUnit的自定义断言函数assertEquals来测试预期值与实际值是否相等。
总结
本文介绍了如何使用PHP面向对象简单工厂模式创建可测试的对象实例。使用简单工厂模式创建对象实例,可以更好地隐藏对象的创建细节,降低了代码的耦合度,在对象的创建和使用过程中提高了代码的重用性和维护性。通过使用抽象类和继承,可以进一步实现可测试的对象实例,提高了代码的测试性。