博客列表 >12月05日设计模式与服务容器-九期线上班

12月05日设计模式与服务容器-九期线上班

WJF
WJF原创
2019年12月06日 19:44:382751浏览

练习案例:


/demo1.php

  1. <?php
  2. //命名空间
  3. namespace w1205;
  4. //单列模式原理
  5. //创建类
  6. class Demo1{
  7. //构造方法 私有化
  8. private function __construct()
  9. {
  10. }
  11. //创建静态属性
  12. public static $inst;
  13. //实例化
  14. public static function get(){
  15. //判断返回当前类实例 没有就实例化 已经存在就返回他
  16. if (is_null(self::$inst)){
  17. self::$inst = new self();
  18. // echo '111';
  19. }return self::$inst;
  20. }
  21. //当前类禁用魔术克隆方法
  22. private function __clone()
  23. {
  24. }
  25. }
  26. //实例化Demo1
  27. $obj1 = Demo1::get();
  28. $obj2 = Demo1::get();
  29. var_dump($obj1,$obj2);
  30. echo '<br>';
  31. var_dump($obj1 === $obj2);
  32. echo '<hr>';
  33. /**********************************/
  34. //单列模式应用场景
  35. //创建类
  36. class Db{
  37. //构造方法 私有化
  38. private function __construct(...$data)
  39. {
  40. //配置数据库基本资料
  41. $dsn = $data[0];
  42. $username = $data[1];
  43. $password = $data[2];
  44. self::$pdo = new \PDO($dsn,$username,$password);
  45. }
  46. //创建静态属性
  47. public static $pdo;
  48. //实例化
  49. public static function get(...$data){
  50. //判断返回当前类实例 没有就实例化 已经存在就返回他
  51. if (is_null(self::$pdo)){
  52. new self(...$data);
  53. }return self::$pdo;
  54. }
  55. //当前类禁用魔术克隆方法
  56. private function __clone()
  57. {
  58. }
  59. }
  60. //实例化Db
  61. $data = ['mysql:host=127.0.0.1;dbname=phpcn','root','root66'];
  62. $pdo = Db::get(...$data);
  63. print_r($pdo->query('SELECT * FROM `user`')->fetchAll());

/demo2.php

  1. <?php
  2. //命名空间
  3. namespace w1205;
  4. //工厂模式 批量创建类的实例或对象
  5. //创建类
  6. class test1{
  7. public function __construct($arg1)
  8. {
  9. echo '成功创建参数:' . $arg1;
  10. }
  11. }
  12. class test2{
  13. public function __construct($arg1,$arg2)
  14. {
  15. echo '成功创建参数:' . $arg1 . '---' . $arg2 ;
  16. }
  17. }
  18. class test3{
  19. public function __construct($arg1,$arg2,$arg3)
  20. {
  21. echo '成功创建参数:' . $arg1 . '---' . $arg2 . '---' . $arg3;
  22. }
  23. }
  24. //工厂类
  25. class Factory{
  26. public static function create($name,...$data){
  27. return new $name(...$data);
  28. }
  29. }
  30. //使用工厂类实例化
  31. Factory::create(test1::class,111);
  32. Factory::create(test2::class,111,222);
  33. Factory::create(test3::class,111,222,333);

/demo3.php

  1. <?php
  2. //命名空间
  3. namespace w1205;
  4. //依赖注入 用来解决对象调用之间的耦合
  5. //工作类
  6. class P{
  7. //需要依赖外部对象
  8. private $car;
  9. //将注入点放到构造方法中
  10. public function __construct(Car $car)
  11. {
  12. $this->car = $car;
  13. }
  14. //从外部对象执行操作
  15. public function work(){
  16. return $this->car->drive();
  17. }
  18. }
  19. //需要依赖对的外部类
  20. class Car{
  21. public function drive(){
  22. return '开车!!!';
  23. }
  24. }
  25. //实例化类
  26. $car = new Car();
  27. $p = new P($car);
  28. echo $p->work();

/M.PHP

  1. <?php
  2. //命名空间
  3. namespace w1205;
  4. //设置数据
  5. class M{
  6. public function get(){
  7. return '中国';
  8. }
  9. }

/P.php

  1. <?php
  2. namespace w1205;
  3. //数据
  4. class P{
  5. public function get(M $m){
  6. return '我们是' . $m->get() .'人';
  7. }
  8. }
  1. <?php
  2. namespace w1205;
  3. //容器类
  4. class C{
  5. //实例当前类容器
  6. protected $inst = [];
  7. //将类实例化的过程绑定到容器
  8. public function bind($alias,\Closure $P){
  9. $this->inst[$alias] = $P;
  10. }
  11. //取出保存在容器中的实例化过程闭包 执行
  12. public function M($alias){
  13. return $this->inst[$alias]();
  14. }
  15. }

/demo1.php

  1. <?php
  2. namespace w1205;
  3. //调用文件
  4. //不调用C容器类
  5. require 'P.php';
  6. require 'M.php';
  7. //创建类
  8. class Client1{
  9. public function show(){
  10. //创建P实例
  11. $p = new P();
  12. //创建M实例
  13. $m = new M();
  14. //将P注入到M中
  15. return $p->get($m);
  16. }
  17. }
  18. //客户端调用
  19. echo (new Client1())->show();

/demo2.php

  1. <?php
  2. namespace w1205;
  3. //引入文件
  4. require 'P.php';
  5. require 'M.php';
  6. require 'C.php';
  7. //创建类 使用容器 把实例化代码放到容器中
  8. class Client2{
  9. //输出P M
  10. public function show(P $p,M $m){
  11. return $p->get($m);
  12. }
  13. }
  14. //将类实例绑定到容器中 并实例化返回
  15. $c = new C();
  16. //将实例化代码绑定到容器
  17. $c->bind('P',function (){return new P();});
  18. $c->bind('M',function (){return new M();});
  19. $p = $c->M('P');
  20. $m = $c->M('M');
  21. echo (new Client2())->show($p,$m);

\inc\a.php

  1. <?php
  2. namespace base\inc;
  3. class a{
  4. public function du(){
  5. return 'A类';
  6. }
  7. }

\inc\b.php

  1. <?php
  2. namespace base\inc;
  3. class a{
  4. public function du(){
  5. return 'A类';
  6. }
  7. }

\inc\c.php

  1. <?php
  2. namespace base\inc;
  3. class a{
  4. public function du(){
  5. return 'A类';
  6. }
  7. }

\auto.php

  1. <?php
  2. //自动加载技术
  3. spl_autoload_register(function ($className){
  4. $path = str_replace('\\', '/', $className);
  5. require dirname(__DIR__) . DIRECTORY_SEPARATOR .$path . '.php';
  6. });

\demo1.php

  1. <?php
  2. //工厂模式 实例
  3. namespace base;
  4. //use外部类名
  5. use base\inc\a;
  6. use base\inc\b;
  7. use base\inc\c;
  8. //引入自动加载文件
  9. require __DIR__ . '\auto.php';
  10. //创建类
  11. class Travel1{
  12. private $vehicle;
  13. //构造方法
  14. public function __construct($v)
  15. {
  16. //设置判断
  17. switch (strtolower($v)){
  18. case 'a':
  19. $this->vehicle = new a();
  20. break;
  21. case 'b':
  22. $this->vehicle = new b();
  23. break;
  24. case 'c':
  25. $this->vehicle = new c();
  26. }
  27. }
  28. //调用外部依赖对象
  29. public function t(){
  30. return $this->vehicle->du() .'装备';
  31. }
  32. }
  33. //调用
  34. echo (new Travel1('a'))->t(),'<hr>';
  35. echo (new Travel1('b'))->t(),'<hr>';
  36. echo (new Travel1('c'))->t(),'<hr>';

\demo2.php

  1. <?php
  2. //工厂模式 实例
  3. namespace base;
  4. //use外部类名
  5. use base\inc\a;
  6. use base\inc\b;
  7. use base\inc\c;
  8. //引入自动加载文件
  9. require __DIR__ . '\auto.php';
  10. //工厂类
  11. class F{
  12. protected static $inst;
  13. public static function get($v){
  14. switch (strtolower($v)){
  15. case 'a':
  16. self::$inst =new a();
  17. break;
  18. case 'b':
  19. self::$inst =new b();
  20. break;
  21. case 'c':
  22. self::$inst =new c();
  23. }
  24. return self::$inst;
  25. }
  26. }
  27. //创建类
  28. class Travel2{
  29. private $vehicle;
  30. //构造方法
  31. public function __construct($v)
  32. {
  33. $this->vehicle = F::get($v);
  34. }
  35. //
  36. // public function __construct($v)
  37. // {
  38. // //设置判断
  39. // switch (strtolower($v)){
  40. // case 'a':
  41. // $this->vehicle = new a();
  42. // break;
  43. // case 'b':
  44. // $this->vehicle = new b();
  45. // break;
  46. // case 'c':
  47. // $this->vehicle = new c();
  48. // }
  49. // }
  50. //调用外部依赖对象
  51. public function t(){
  52. return $this->vehicle->du() .'装备!';
  53. }
  54. }
  55. //调用
  56. echo (new Travel2('a'))->t(),'<hr>';
  57. echo (new Travel2('b'))->t(),'<hr>';
  58. echo (new Travel2('c'))->t(),'<hr>';

/demo3.php

  1. <?php
  2. namespace base;
  3. //引用
  4. use base\incs\a;
  5. use base\incs\b;
  6. use base\incs\c;
  7. use base\incs\iV;
  8. require __DIR__ . '/auto.php';
  9. class demo3{
  10. private $vehicle;
  11. public function __construct(iV $vehicle)
  12. {
  13. $this->vehicle = $vehicle;
  14. }
  15. public function travelModel(){
  16. return $this->vehicle->du() . '装备!!!';
  17. }
  18. }
  19. echo (new demo3(new a()))->travelModel(), '<br>';
  20. echo (new demo3(new b()))->travelModel(), '<br>';
  21. echo (new demo3(new c()))->travelModel(), '<br>';

手写




总结


单例模式:设置类中唯一实例 通过判断禁止出现一个类 多个实例
工厂模式:通过数据调入批量创建多个统一规范的类实例/对象


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