博客列表 >PHP 设计模式——单例模式、工厂模式------PHP第十期线上班 学号:510251 02月18日作业

PHP 设计模式——单例模式、工厂模式------PHP第十期线上班 学号:510251 02月18日作业

赵大叔
赵大叔原创
2020年03月30日 23:53:44552浏览

一、单例模式

单例模式:创建类的唯一实例,不允许多次实例化一个类,例如数据库的连接有最大上限1000,NEW一次PDO就会多一个类实例,前面的连接如果没释放,就会增加一个,达到最大连接数以后,后面的就不无法再连接数据库了。

将类中的构造方式私有化private, 防止从外部通过new实例化这个类; 转为从类的内部将它实例化——>创建一个公共的静态方法,返回当前类的唯一实例

克隆方法私有化,防止克隆当前对象: private function __clone()

1.1 单例模式代码和应用 :

  1. <?php
  2. namespace chapter7;
  3. // 一般模式:每new一次就会创建一个对象
  4. class Temp
  5. {
  6. //...
  7. }
  8. // 实例化
  9. $obj1 = new Temp;
  10. $obj2 = new Temp;
  11. var_dump($obj1);
  12. echo '<br>';
  13. var_dump($obj2);
  14. echo '<br>';
  15. // 创建了二个完全不同的对象
  16. var_dump($obj1 === $obj2);
  17. echo '<hr>';
  18. //单例模式: 创建类的唯一实例
  19. class Demo1
  20. {
  21. // 将类中的构造方式私有化, 防止从外部通过new实例化这个类
  22. private function __construct()
  23. {
  24. }
  25. // 既然外部不能实例化, 那么只能从为类的内部将它实例化
  26. // 创建一个公共的静态方法,返回当前类的唯一实例
  27. // 当前类实例
  28. private static $instance = null;
  29. public static function getInstance()
  30. {
  31. if (is_null(self::$instance)) {
  32. self::$instance = new self();
  33. }
  34. // 当前类已经实例化过了, 就不要重复实例化,直接返回
  35. return self::$instance;
  36. }
  37. // 克隆方法私有化,防止克隆当前对象
  38. private function __clone()
  39. {
  40. }
  41. }
  42. // 在类的外部不能用对象访问类成员,只能用类,意味着只能访问静态成员
  43. // 获取当前类的唯一实例
  44. $obj1 = Demo1::getInstance();
  45. $obj2 = Demo1::getInstance();
  46. var_dump($obj1 === $obj2);
  47. echo '<br>';
  48. var_dump($obj1);
  49. echo '<br>';
  50. var_dump($obj2);
  51. echo '<hr>';

1.2 效果图:

二、工厂模式:

  • 将原来依赖对象通过一个工厂来实例化

2.1 工厂模式代码:

  1. //vung1类
  2. <?php
  3. namespace base\inc1;
  4. // Vung1类
  5. class Vung1
  6. {
  7. public function sanxuat()
  8. {
  9. return 'soi tho';
  10. }
  11. }
  12. //soicon类
  13. <?php
  14. namespace base\inc1;
  15. // Soicon类
  16. class Soicon
  17. {
  18. public function sanxuat()
  19. {
  20. return 'soi con';
  21. }
  22. }
  23. //danho类
  24. <?php
  25. namespace base\inc1;
  26. // Danho类
  27. class Danho
  28. {
  29. public function sanxuat()
  30. {
  31. return 'thanh pham';
  32. }
  33. }
  34. //工厂模式:将原来依赖对象通过一个工厂来实例化
  35. class Xuong
  36. {
  37. private static $instance = null;
  38. public static function getInstance($sanxuat)
  39. {
  40. switch (strtolower($sanxuat)) {
  41. case 'vung1':
  42. self::$instance = new Vung1();
  43. break;
  44. case 'soicon':
  45. self::$instance = new Soicon();
  46. break;
  47. case 'danho':
  48. self::$instance = new Danho();
  49. break;
  50. }
  51. // 返回具体的类实例
  52. return self::$instance;
  53. }
  54. }
  55. // Sanxuat类
  56. class Sanxuat2
  57. {
  58. // Sanxuat车间
  59. private $sanxuat;
  60. // 将原构造方法中实例化依赖对象的过程,交给工厂类完成了
  61. public function __construct($sanxuat = null)
  62. {
  63. // 将原来依赖三个类, 变成了依赖一个工厂类
  64. $this->sanxuat = Xuong::getInstance($sanxuat);
  65. }
  66. // 调用外部依赖的对象的方法
  67. public function sanxuatMode()
  68. {
  69. return '产品是:===> '. $this->sanxuat->sanxuat();
  70. }
  71. }
  72. // 客户端调用
  73. echo (new Sanxuat2('vung1'))->sanxuatMode() . '<br>';
  74. echo (new Sanxuat2('soicon'))->sanxuatMode() . '<br>';
  75. echo (new Sanxuat2('danho'))->sanxuatMode() . '<br>';

2.2 效果图:


三、抽象工厂模式

3.1 抽象工厂模式代码:

  1. <?php
  2. namespace chapter7;
  3. // 导入刚才创建的三个类
  4. use base\inc2\iVehicle1;
  5. use base\inc2\Vung1;
  6. use base\inc2\Soicon;
  7. use base\inc2\Danho;
  8. // 自动加载器
  9. require __DIR__ . '/autoload.php';
  10. // Sanxuat类
  11. class Sanxuat3
  12. {
  13. // Sanxuat车间
  14. private $sanxuat;
  15. // 将原构造方法中实例化依赖对象的过程,交给工厂类完成了
  16. public function __construct(iVehicle1 $sanxuat = null)
  17. {
  18. // 将原来依赖三个类, 变成了依赖一个工厂类
  19. $this->sanxuat = $sanxuat;
  20. }
  21. // 调用外部依赖的对象的方法
  22. public function sanxuatMode()
  23. {
  24. return '产品是:+++> '. $this->sanxuat->sanxuat();
  25. }
  26. }
  27. // 客户端调用
  28. echo (new Sanxuat3(new Vung1()))->sanxuatMode() . '<br>';
  29. echo (new Sanxuat3(new Soicon()))->sanxuatMode() . '<br>';
  30. echo (new Sanxuat3(new Danho()))->sanxuatMode() . '<br>';

3.2 效果图:

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议