Blogger Information
Blog 34
fans 0
comment 0
visits 22530
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
12月5日—设计模式与依赖管理
曾龙宇
Original
646 people have browsed it

单例模式

  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>';

手抄作业

总结

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

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

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

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

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