在没有使用工厂模式时的实现方式:
interface Api {
public function test1();
}
class Impl implements Api {
public function test1() {
}
}
class Client {
public static function main() {
$api = new Impl;
$api->test();
}
}
面向接口编程是面象对象编程的重要思想,
接口的思想: 封闭隔离
以上实现违背了面象接口编程的思想,因为客户端不但知道了接口,还知道了具体实现。我们要如何隐藏实现呢?一个合理的解决方案就是——
简单工厂。
简单工厂的定义:
提供一个创建对象实例的功能,无须关心其具备的实现,被创建的类型可以是接口,也可以是抽象类,还可以是具体的实现。
在之前的代码基础上提供工厂类:
class Factory { public static function createApi($condition) { $api = null; switch($condition) { case '1': $api = new ImplA; break; case '2': $api = new ImplB; } return $api; } }
class Client { public static function main() { $api = Factory::createApi(1); $api->test(); } }
/**
理解简单工厂的重要切入点:客户端在使用的时候,不在自己去创建对象,而由工厂去创建对象。客户端不知道知道具体实现是什么?也不知道如何实现,客户端只知道得到了一个实例,从而获得想要的功能。因此达到封闭隔离的效果
*/