Blogger Information
Blog 119
fans 3
comment 1
visits 94613
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP 设计模式——单例模式、工厂模式------PHP第十期线上班 学号:510251 02月18日作业
赵大叔
Original
556 people have browsed it

一、单例模式

单例模式:创建类的唯一实例,不允许多次实例化一个类,例如数据库的连接有最大上限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 效果图:

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:思维很清楚,流程很明白, 相信你对这几个最简单的设计 模式是掌握了
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post