PHP - 工厂模式

一、概述

工厂模式是我们最常用的实例化对象模式,使用工厂模式代替new的一种模式。

根据抽象程度不同,PHP工厂模式分为三种:

1、简单工厂模式

2、工厂方法模式

3、抽象工厂模式

 

二、简单工厂模式

  1. <?php
  2. declare(strict_types = 1);
  3. interface DataBase
  4. {
  5. public function conn();
  6. }
  7. class Mysql implements DataBase
  8. {
  9. public function conn()
  10. {
  11. return '这里是Mysql连接,已经连接';
  12. }
  13. }
  14. class Oracle implements DataBase
  15. {
  16. public function conn()
  17. {
  18. return '这里是Oracle连接,已经连接';
  19. }
  20. }
  21. class DataBaseFactory
  22. {
  23. const MYSQL = 1; // Mysql
  24. const ORACLE = 2; // Oracle
  25. public static function getDataBase(int $type)
  26. {
  27. switch ($type) {
  28. case self::MYSQL:
  29. return new Mysql();
  30. break;
  31. case self::ORACLE:
  32. return new Oracle();
  33. break;
  34. default:
  35. break;
  36. }
  37. }
  38. }
  39. echo DataBaseFactory::getDataBase(1)->conn();
  40. echo DataBaseFactory::getDataBase(2)->conn();

 

三、工厂方法模式

简单工厂模式虽然实现了工厂封装,但如果这时添加了一个需求,要一个 SqlLite 连接,这时,必然又得修改已经封装好的代码,违反了面向对象编程中的开闭原则(对于修改是关闭的,对于扩展是开放的),因此工厂方法诞生。

  1. <?php
  2. declare(strict_types = 1);
  3. /**
  4. * 实现数据库工厂类接口
  5. * Interface DataBase
  6. */
  7. interface DataBase
  8. {
  9. public function conn();
  10. }
  11. class MySql implements DataBase
  12. {
  13. public function conn()
  14. {
  15. return '这里是Mysql连接,已经连接';
  16. }
  17. }
  18. class Oracle implements DataBase
  19. {
  20. public function conn()
  21. {
  22. return '这里是Oracle连接,已经连接';
  23. }
  24. }
  25. /**
  26. * 创建数据库工厂类接口
  27. * Interface DataBaseFactory
  28. */
  29. interface DataBaseFactory
  30. {
  31. public static function createDataBase();
  32. }
  33. class MySqlFactory implements DataBaseFactory
  34. {
  35. public static function createDataBase()
  36. {
  37. return new MySql();
  38. }
  39. }
  40. class OracleFactory implements DataBaseFactory
  41. {
  42. public static function createDataBase()
  43. {
  44. return new Oracle();
  45. }
  46. }
  47. echo MySqlFactory::createDataBase()->conn();
  48. echo OracleFactory::createDataBase()->conn();
  49. // 这时,如果添加了sqlLite连接的需求,不用修改原代码,只需要扩展新代码即可
  50. /*
  51. class SqlLiteFactory implements DataBaseFactory
  52. {
  53. public static function createDataBase()
  54. {
  55. return new SqlLite();
  56. }
  57. }
  58. class SqlLite
  59. {
  60. public function conn()
  61. {
  62. return '这里是SqlLite连接,已经连接';
  63. }
  64. }
  65. */
  66. //echo SqlLiteFactory::createDataBase()->conn();

 

 



Top