简单工厂模式的主要核心是if+else或者switch+case做判断,抽象工厂模式是一组相互依赖的对象接口而无需实现类。工厂模式实例化每个方法都要通过分支判断有违开闭原则。使用反射和依赖注入的形式可以有效达到高内聚低耦合,减少判断分支。
    举例:通过实现类对不同db的相同表进行操作;

    1. <?php
    2. //抽象工厂
    3. namespace demo;
    4. //班级接口
    5. interface Class{
    6. //抽象方法
    7. public function insert(array $data);
    8. public function getClassById(int $id);
    9. }
    10. //学生接口
    11. interface Student{
    12. //抽象方法
    13. public function insert(array $data);
    14. public function getStudentById(int $id);
    15. }
    16. //mysql班级实现类
    17. class MysqlClass implements Class{
    18. //实现方法
    19. public function insert(array $data){
    20. echo 'Mysql创建一个新的班级';
    21. }
    22. public function getClassById(int $id){
    23. echo 'Mysql查询id为'.$id.'的班级';
    24. }
    25. }
    26. //mysql学生实现类
    27. class MysqlStudent implements Student{
    28. //实现方法
    29. public function insert(array $data){
    30. echo 'Mysql录入一个新的学生';
    31. }
    32. public function getStudentById(int $id){
    33. $object=null;
    34. return $object;
    35. }
    36. }
    37. //Oracle班级实现类
    38. class OracleClass implements Class{
    39. //实现方法
    40. public function insert(array $data){
    41. echo 'Oracle创建一个新的班级';
    42. }
    43. public function getClassById(int $id){
    44. echo 'Oracle查询id为'.$id.'的班级';
    45. }
    46. }
    47. //Oracle学生实现类
    48. class OracleStudent implements Student{
    49. //实现方法
    50. public function insert(array $data){
    51. echo 'Oracle录入一个新的学生';
    52. }
    53. public function getStudentById(int $id){
    54. $object=null;
    55. return $object;
    56. }
    57. }
    58. ?>
    1. <?php
    2. //反射工厂
    3. namespace demo;
    4. use ReflectionClass;
    5. use ReflectionException;
    6. class Factory{
    7. //数据库名
    8. private function $db = 'Mysql';
    9. //命名空间
    10. private function $namespace = 'demo';
    11. //构造方法
    12. public function __construct($db){
    13. $this->db = $db;
    14. }
    15. public function createClass(){
    16. $className = $this->namespace . $this->db . 'Class';
    17. try {
    18. $class = new ReflectionClass($className);
    19. $class = $class->newInstance();
    20. } catch (ReflectionException $Exception) {
    21. throw new \InvalidArgumentException('不支持的数据库类型');
    22. }
    23. return $class;
    24. }
    25. public function createStudent(){
    26. $className = $this->namespace . $this->db . 'Student';
    27. try {
    28. $student = new ReflectionClass($className);
    29. $student = $student->newInstance();
    30. } catch (ReflectionException $Exception) {
    31. throw new \InvalidArgumentException('不支持的数据库类型');
    32. }
    33. return $student;
    34. }
    35. }
    36. ?>
    1. <?php
    2. //具体实现
    3. namespace demo;
    4. use ReflectionClass;
    5. use ReflectionException;
    6. class Client{
    7. public function index(){
    8. //由于‘mysql’是变量,所以可以直接由配置文件获取
    9. $db = config('db')?config('db'):'Mysql';
    10. $factory = new Factory($db);
    11. //录入学生
    12. $student = $factory->createStudent();
    13. $student->insert(['id'=>1,'name'=>'张三']);
    14. //创建班级
    15. $class = $factory->createClass();
    16. $class->insert(['id'=>1,'name'=>'班级1']);
    17. //举例
    18. echo 'id为1的学生的名字为'.$student->getStudentById(1)->name;
    19. }
    20. }
    21. ?>