博客列表 >12月5日—设计模式与依赖管理

12月5日—设计模式与依赖管理

曾龙宇
曾龙宇原创
2019年12月06日 15:52:28639浏览

单例模式

  1. <?php
  2. namespace _1205;
  3. //单例模式:只允许存在一个实例对象,对类实例化得到的都是相同的一个实例,确保所有对象都访问一个实例
  4. class Temp{
  5. //...
  6. }
  7. //用同一个类创建的实例,每次创建的实例都是不同的,不是同一个实例
  8. $obj1 = new Temp();
  9. $obj2 = new Temp();
  10. var_dump($obj1,$obj2);
  11. echo '<br>';
  12. var_dump($obj1===$obj2);
  13. echo '<hr>';
  14. //单例模式原理
  15. class Demo1{
  16. //构造方法私有化
  17. private function __construct(){
  18. //...
  19. }
  20. //因为构造方法私有化,在类外部不能实例化类了,只能在类中将类实例化
  21. public static $instance = null;
  22. //实例化当前类的方法
  23. public static function getInstance(){
  24. //实例化当前类,并返回实例化对象
  25. //判断当前类是否已经实例化
  26. if (is_null(self::$instance)){
  27. self::$instance = new self();
  28. }
  29. return self::$instance;
  30. }
  31. //禁用克隆魔术方法
  32. private function __clone(){
  33. //...
  34. }
  35. }
  36. //测试方法
  37. $obj1 = Demo1::getInstance();
  38. $obj2 = Demo1::getInstance();
  39. var_dump($obj1,$obj2);
  40. echo '<br>';
  41. var_dump($obj1===$obj2);
  42. echo '<hr>';
  43. //测试结果:通过单例模式生成的实例化对象都是同一个,不管生成多少次
  44. //单例模式应用场景:数据库连接
  45. class Db{
  46. //定义静态数据库连接pdo
  47. public static $pdo = null;
  48. //构造方法私有化
  49. private function __construct(...$connectParams){
  50. $dsn = $connectParams[0];
  51. $user = $connectParams[1];
  52. $pwd = $connectParams[2];
  53. self::$pdo = new \PDO($dsn,$user,$pwd);
  54. }
  55. public static function getInstance(...$connectParams){
  56. if (is_null(self::$pdo)){
  57. new self(...$connectParams);
  58. }
  59. return self::$pdo;
  60. }
  61. //禁用克隆魔术方法
  62. private function __clone(){
  63. //...
  64. }
  65. }
  66. echo '<hr>';
  67. $connectParams = ['mysql:host=localhost;dbname=demo','root','root'];
  68. $pdo = Db::getInstance(...$connectParams);
  69. print_r($pdo->query('select * from `user`')->fetchAll(\PDO::FETCH_ASSOC));

工厂模式

  1. <?php
  2. namespace _1205;
  3. //工厂模式:用于批量创建类的实例/对象
  4. class Demo2{
  5. //...
  6. }
  7. //假如要在多个文件中使用Demo2的实例,以前的做法就是美一个文件中引入并实例化
  8. class Test1{
  9. public function __construct($arg1){
  10. echo '对象创建成功,参数是:'.$arg1;
  11. }
  12. }
  13. class Test2{
  14. public function __construct($arg1,$arg2){
  15. echo '对象创建成功,参数是:'.implode(',',[$arg1,$arg2]);
  16. }
  17. }
  18. class Test3{
  19. public function __construct($arg1,$arg2,$arg3){
  20. echo '对象创建成功,参数是:'.implode(',',[$arg1,$arg2,$arg3]);
  21. }
  22. }
  23. //工厂类,专用于创建类实例
  24. class Factory{
  25. public static function create($className,...$argments){
  26. return new $className(...$argments);
  27. }
  28. }
  29. //类名::class:可以获得完整的类名,带命名空间
  30. //用工厂类创建实例
  31. Factory::create(Test1::class,100);
  32. echo '<br>';
  33. Factory::create(Test2::class,100,200);
  34. echo '<br>';
  35. Factory::create(Test3::class,100,200,300);

依赖注入

  1. <?php
  2. namespace _1205;
  3. //依赖注入:解决对象调用之间的耦合度
  4. //工作类
  5. class Person{
  6. //要依赖的外部对象
  7. private $car = null;
  8. //在构造方法中将依赖的外部对象全部实例化
  9. //注入点放在构造方法中
  10. public function __construct(){
  11. $this->car = new Car();
  12. }
  13. //外部对象执行一个动作
  14. public function work(){
  15. return $this->car->drive();
  16. }
  17. }
  18. //依赖的外部类
  19. class Car{
  20. public function drive(){
  21. return '开车去上班';
  22. }
  23. }
  24. //实例化类
  25. $person = new Person();
  26. echo $person->work();
  27. echo '<hr>';
  28. /*********************************/
  29. class Person1{
  30. //要依赖的外部对象
  31. private $car = null;
  32. //在构造方法中将依赖的外部对象全部实例化
  33. //注入点放在构造方法中
  34. public function __construct(Car1 $car){
  35. $this->car = $car;
  36. }
  37. //外部对象执行一个动作
  38. public function work(){
  39. return $this->car->drive();
  40. }
  41. }
  42. //依赖的外部类
  43. class Car1{
  44. public function drive(){
  45. return '开小汽车去上班';
  46. }
  47. }
  48. //实例化类
  49. $car = new Car1();
  50. $person = new Person1($car);
  51. echo $person->work();
  52. echo '<hr>';

服务容器的原理与实现

  1. <?php
  2. namespace _1205;
  3. //引入需要用的类
  4. require 'Product.php';
  5. require 'Maker.php';
  6. require 'Container.php';
  7. class Client2{
  8. public function show(Product $product,Maker $maker){
  9. return $product->get($maker);
  10. }
  11. }
  12. //客户端调用
  13. //将类实例化绑定到容器中并实例化返回
  14. $container = new Container();
  15. //将实例化代码绑定要容器中
  16. $container->bind('product',function (){return new Product();});
  17. $container->bind('maker',function (){return new Maker();});
  18. //创建类实例并返回
  19. $product = $container->make('product');
  20. $maker = $container->make('maker');
  21. echo (new Client2())->show($product,$maker).'测试容器';

面向接口编程

  1. <?php
  2. namespace base;
  3. //使用工厂类
  4. //设置引用的外部类别名
  5. use base\inc2\Car;
  6. use base\inc2\Train;
  7. use base\inc2\Plane;
  8. use base\inc2\Ship;
  9. use base\inc2\iVehicle;
  10. require __DIR__.'/autoload.php';
  11. class Travel3{
  12. private $vehicle;
  13. //构造方法参数:第一个是接口,第二个是类
  14. public function __construct(iVehicle $vehicle){
  15. $this->vehicle = $vehicle;
  16. }
  17. //调用外部一个依赖对象
  18. public function travelModel(){
  19. return $this->vehicle->drive().'###去旅行';
  20. }
  21. }
  22. //客户端调用
  23. echo (new Travel3(new Car()))->travelModel().'<br>';
  24. echo (new Travel3(new Train()))->travelModel().'<br>';
  25. echo (new Travel3(new Plane()))->travelModel().'<br>';
  26. echo (new Travel3(new Ship()))->travelModel().'<br>';

手抄作业

总结

一、单例模式:只允许存在一个实例对象,实例化得到的都是同一个对象,确保所有对象都访问同一个实例;三步:①、构造方法私有化,②、定义一个静态属性,③、对外提供获取实例的方法。

工厂模式:批量创建类实例化对象,类里面使用对外静态方法。

依赖注入:解决对象调用之间的耦合,区别在于注入点的不同

面向接口编程:在接口定义一连串的方法,再由具体初始类去实现该接口的方法,工作类中可以在构造方法参数中使用(接口 实现接口的类)

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