博客列表 >12月05日:设计模式与依赖注入面向接口编程

12月05日:设计模式与依赖注入面向接口编程

Rambo-Yang
Rambo-Yang原创
2019年12月09日 23:50:56698浏览

一、单例模式

单例模式:创建类的唯一实例,应用场景:PDO链接数据库

  1. //单例模式
  2. namespace _1205;
  3. //PDO链接
  4. class Db
  5. {
  6. //创建私有化静态属性
  7. public static $pdo = null;
  8. //构造方法私有化
  9. private function __construct(...$params)
  10. {
  11. $dsn = $params[0];
  12. $username= $params[1];
  13. $password=$params[2];
  14. self::$pdo = new \PDO($dsn,$username,$password);
  15. }
  16. public static function connect(...$params)
  17. {
  18. if (is_null(self::$pdo)){
  19. new self(...$params);
  20. }
  21. return self::$pdo;
  22. }
  23. // 禁用克隆魔术方法
  24. private function __clone()
  25. {
  26. }
  27. }
  28. $params = ['mysql:host=localhost;dbname=movies','root','root'];
  29. $pdo = Db::connect(...$params);
  30. $sql = "SELECT * FROM `category` WHERE `cate_id` > :id";
  31. $stmt = $pdo->prepare($sql);
  32. $stmt->execute(['id'=>20]);
  33. //print_r($stmt->debugDumpParams());
  34. while($row = $stmt->fetch(\PDO::FETCH_ASSOC)){
  35. echo '<pre>'.print_r($row,true);
  36. }

代码运行效果:

二、工厂模式

工厂模式:用于批量创建类的实例/对象

  1. //工厂模式:用于批量创建类的实例/对象
  2. namespace _1205;
  3. class Test1
  4. {
  5. public function __construct($arg1)
  6. {
  7. echo '对象创建成功,参数是:'.$arg1;
  8. }
  9. }
  10. class Test2
  11. {
  12. public function __construct($arg1,$arg2)
  13. {
  14. echo '对象创建成功,参数是:'.implode(', ', [$arg1, $arg2]);
  15. }
  16. }
  17. class Test3
  18. {
  19. public function __construct($arg1,$arg2,$arg3)
  20. {
  21. echo '对象创建成功,参数是:'.implode(', ', [$arg1, $arg2, $arg3]);
  22. }
  23. }
  24. class Factory
  25. {
  26. public static function create($className,...$argments)
  27. {
  28. return new $className(...$argments);
  29. }
  30. }
  31. Factory::create(Test1::class,100);
  32. echo '<hr>';
  33. Factory::create(Test2::class,100,200);
  34. echo '<hr>';
  35. Factory::create(Test3::class,100,200,300);

运行效果:

三、依赖注入

依赖注入:解决对象调用之间的耦合问题

demo.php

  1. namespace _1205;
  2. require 'Maker.php';
  3. require 'Product.php';
  4. require 'Container.php';
  5. //控制器
  6. class Show2
  7. {
  8. //输出商品与制造商
  9. public function show(Product $product, Maker $maker){
  10. //制造商注入到产品类
  11. return $product->get($maker);
  12. }
  13. }
  14. //将类实例绑定到容器中并实例化返回
  15. $container = new Container();
  16. //将实例化代码绑定到容器中
  17. $container->bind('product',function (){return new Product();});
  18. $container->bind('maker',function (){return new Maker();});
  19. //创建类实例并返回
  20. $product = $container->make('product');
  21. $maker = $container->make('maker');
  22. //客户端调用
  23. $show = new Show2();
  24. echo '容器:'.$show->show($product,$maker);

Product.php

  1. namespace _1205;
  2. //商品类
  3. class Product
  4. {
  5. public function get(Maker $maker){
  6. return '该手机是由:'. $maker->get() .'生产的';
  7. }
  8. }

Maker.php

  1. namespace _1205;
  2. //制造商
  3. class Maker
  4. {
  5. public function get()
  6. {
  7. return '华为';
  8. }
  9. }

Container.php(服务容器)

  1. //容器类
  2. namespace _1205;
  3. use Closure; //引入闭包类型
  4. class Container
  5. {
  6. //创建容器数组,里面存储创建对象的方法
  7. protected $instance = [];
  8. //存进去:将类实例化的过程绑定到容器中,$alias是类名,$process是实例化代码=new Product();
  9. public function bind($alias,Closure $process){
  10. $this->instance[$alias] = $process;
  11. }
  12. //取出来:取出保存在容器中的实例化过程的闭包,并执行它,就是上面绑定的$process
  13. public function make($alias,$params = []){
  14. //$this->instance[$alias]是一个闭包函数
  15. //$this->instance[$alias]() 返回的是一个类实例对象_1205\Product
  16. return $this->instance[$alias]();
  17. }
  18. }

运行效果:

四、工厂方法实例

  1. //工厂模式
  2. namespace base;
  3. use base\inc1\Car;
  4. use base\inc1\Train;
  5. use base\inc1\Plane;
  6. require __DIR__ . '/autoload.php';
  7. class Factory
  8. {
  9. protected static $in = null;
  10. public static function getInfo($className){
  11. switch (strtolower($className)){
  12. case 'car':
  13. self::$in = new Car();
  14. break;
  15. case 'train':
  16. self::$in = new Train();
  17. break;
  18. case 'plane':
  19. self::$in = new Plane();
  20. }
  21. return self::$in;
  22. }
  23. }
  24. class Travel2
  25. {
  26. private $vehicle;
  27. public function __construct($vehicle)
  28. {
  29. $this->vehicle = Factory::getInfo($vehicle);
  30. }
  31. public function travelModel(){
  32. return $this->vehicle->drive().' : 去旅行';
  33. }
  34. }
  35. echo (new Travel2('car'))->travelModel() . '<br>';
  36. echo (new Travel2('train'))->travelModel() . '<br>';
  37. echo (new Travel2('plane'))->travelModel() . '<br>';

五、面向接口编程

Car.php

  1. namespace base\inc2;
  2. class Car implements iVehicle
  3. {
  4. public function drive(){
  5. return '开汽车';
  6. }
  7. }

Plane.php

  1. namespace base\inc2;
  2. class Plane implements iVehicle
  3. {
  4. public function drive(){
  5. return '坐飞机';
  6. }
  7. }

Train.php

  1. namespace base\inc2;
  2. class Train implements iVehicle
  3. {
  4. public function drive(){
  5. return '坐火车';
  6. }
  7. }

iVehicle.php(接口)

  1. namespace base\inc2;
  2. interface iVehicle
  3. {
  4. public function drive();
  5. }

autoload.php

  1. spl_autoload_register(function ($className){
  2. $path = str_replace('\\','/',$className);
  3. include dirname(__DIR__) . DIRECTORY_SEPARATOR.$path.'.php';
  4. });

Travel.php

  1. namespace base;
  2. use base\inc2\Car;
  3. use base\inc2\iVehicle;
  4. use base\inc2\Train;
  5. use base\inc2\Plane;
  6. require __DIR__ . '/autoload.php';
  7. class Travel3
  8. {
  9. public $vehicle;
  10. public function __construct(iVehicle $vehicle)
  11. {
  12. $this->vehicle = $vehicle;
  13. }
  14. public function travelMedol(){
  15. return $this->vehicle->drive() .' : 3-去旅行';
  16. }
  17. }
  18. echo (new Travel3(new Car()))->travelMedol().'<br>';
  19. echo (new Travel3(new Train()))->travelMedol().'<br>';
  20. echo (new Travel3(new Plane()))->travelMedol().'<br>';

手写:

总结:

  1. 单例模式:创建唯一实例,典型场景:用于数据库连接
  2. 工厂模式:用于批量创建类的实例/对象
  3. 依赖注入:解决对象调用之间的耦合,主要通过构造方法注入
  4. 服务容器:将类的实例和实例化方法统一管理,并在类中提供绑定方法和执行方法(简称存进去,取出来)
  5. 面向接口编程:有点抽象。。。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议