简单工厂模式的主要核心是if+else或者switch+case做判断,抽象工厂模式是一组相互依赖的对象接口而无需实现类。工厂模式实例化每个方法都要通过分支判断有违开闭原则。使用反射和依赖注入的形式可以有效达到高内聚低耦合,减少判断分支。
举例:通过实现类对不同db的相同表进行操作;
<?php//抽象工厂namespace demo;//班级接口interface Class{//抽象方法public function insert(array $data);public function getClassById(int $id);}//学生接口interface Student{//抽象方法public function insert(array $data);public function getStudentById(int $id);}//mysql班级实现类class MysqlClass implements Class{//实现方法public function insert(array $data){echo 'Mysql创建一个新的班级';}public function getClassById(int $id){echo 'Mysql查询id为'.$id.'的班级';}}//mysql学生实现类class MysqlStudent implements Student{//实现方法public function insert(array $data){echo 'Mysql录入一个新的学生';}public function getStudentById(int $id){$object=null;return $object;}}//Oracle班级实现类class OracleClass implements Class{//实现方法public function insert(array $data){echo 'Oracle创建一个新的班级';}public function getClassById(int $id){echo 'Oracle查询id为'.$id.'的班级';}}//Oracle学生实现类class OracleStudent implements Student{//实现方法public function insert(array $data){echo 'Oracle录入一个新的学生';}public function getStudentById(int $id){$object=null;return $object;}}?>
<?php//反射工厂namespace demo;use ReflectionClass;use ReflectionException;class Factory{//数据库名private function $db = 'Mysql';//命名空间private function $namespace = 'demo';//构造方法public function __construct($db){$this->db = $db;}public function createClass(){$className = $this->namespace . $this->db . 'Class';try {$class = new ReflectionClass($className);$class = $class->newInstance();} catch (ReflectionException $Exception) {throw new \InvalidArgumentException('不支持的数据库类型');}return $class;}public function createStudent(){$className = $this->namespace . $this->db . 'Student';try {$student = new ReflectionClass($className);$student = $student->newInstance();} catch (ReflectionException $Exception) {throw new \InvalidArgumentException('不支持的数据库类型');}return $student;}}?>
<?php//具体实现namespace demo;use ReflectionClass;use ReflectionException;class Client{public function index(){//由于‘mysql’是变量,所以可以直接由配置文件获取$db = config('db')?config('db'):'Mysql';$factory = new Factory($db);//录入学生$student = $factory->createStudent();$student->insert(['id'=>1,'name'=>'张三']);//创建班级$class = $factory->createClass();$class->insert(['id'=>1,'name'=>'班级1']);//举例echo 'id为1的学生的名字为'.$student->getStudentById(1)->name;}}?>
