博主信息
博文 119
粉丝 3
评论 1
访问量 121237
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
PHP 设计模式——单例模式、工厂模式------PHP第十期线上班 学号:510251 02月18日作业
赵大叔
原创
749人浏览过

一、单例模式

单例模式:创建类的唯一实例,不允许多次实例化一个类,例如数据库的连接有最大上限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举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学