【精选】面试官:聊下常见设计模式有哪些?

举报
lxw1844912514 发表于 2022/03/27 00:30:06 2022/03/27
【摘要】 1.常见设计模式 单例模式解决的是如何在整个项目中创建唯一对象实例的问题,避免重复创建(实例化) 对象,已经有现成的实例就用现成的。减少资源的浪费(因为创建多个实例,浪费内存, 完全没必要),单件模式保证了每时每刻引用的都是同一个实例。最常用的地方是数据库连接。 工厂模式 是一种类,它具有为您创建对象的某些方法。工厂模式解...

697ea00989942f6c1dd824f28d562a29.png

1.常见设计模式

单例模式解决的是如何在整个项目中创建唯一对象实例的问题,避免重复创建(实例化) 对象,已经有现成的实例就用现成的。减少资源的浪费(因为创建多个实例,浪费内存, 完全没必要),单件模式保证了每时每刻引用的都是同一个实例。最常用的地方是数据库连接。

工厂模式 是一种类,它具有为您创建对象的某些方法。工厂模式解决的是如何不通过 new建立实例对象的方法,您可以使用工厂类创建对象,而不直接使用 new。这样,如 果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动 更改。

适配器模式:将各种截然不同的函数接口封装成统一的API,首先定义一个接口(有几个 方法,以及相应的参数)。然后,有几种不同的情况,就写几个类实现该接口。将完成相 似功能的函数,统一成一致的方法。

策略模式:将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,用意是 对一组算法的封装。动态的选择需要的算法并使用。


   
  1. 实现单例模式的要点:
  2. 三私一公:私有化静态属性,私有化构造方法,私有化克隆方法,公有化静态方法。

   
  1. <?php
  2. //(1). 需要一个保存类的唯一实例的静态成员变量:
  3. private  static $instance; //私有化静态属性
  4. //(2). 构造函数和克隆函数必须声明为私有的,防止外部程序new类从而失去单例模式 的意义:
  5. private function __construct() //私有化构造方法
  6. {
  7.     $this->_db = pg_connect('xxxx');
  8. }
  9. private function __clone() //私有化克隆方法,禁止克隆
  10. {
  11. }
  12. //(3). 必须提供一个访问这个实例的公共的静态方法(通常为getInstance方法),从 而返回唯一实例的一个引用
  13. public static function getInstance()
  14. {
  15.     if (!(self::$_instance instanceof self)) {
  16. //公有化静态方法
  17.         self::$_instance = new self();
  18.     }
  19.     return self::$_instance;
  20. }

2.实现一个数据结构,要求set(index,val)、get(index)、setAll(val)三种操作时间复杂度都 是O(1);

重点是set value 的时候记录一下计数器的值,setAll 的时候修改计数器的值,这样查到 具体值后,比较当前计数器值和保存的计数器值是否一致,选择返回全局值还是当前值


   
  1. <?php
  2. $node = new Node();
  3. $node->set(02);
  4. $node->setAll(3);
  5. return $node->get(0);
  6. class Node
  7. {
  8.     private static int $counter = 0// 计数器,记录是否被修改过 private static array $array; // 数组存储
  9.     private static int $globalValue; // 全局的值
  10.     public function set($index, $value)
  11.     {
  12.         self::$array[$index] = [self::$counter, $value];
  13.     }
  14.     public function get($index)
  15.     {
  16.         $tmp = self::$array[$index][0];
  17.         $value = self::$array[$index][1];
  18.         if ($tmp == self::$counter) return $value;
  19.         return self::$globalValue;
  20.     }
  21.     public function setAll($value)
  22.     {
  23.         self::$counter++;
  24.         self::$globalValue = $value;
  25.     }
  26. }

3.Redis 缓存击穿,缓存穿透,缓存雪崩区别及解决方案

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,造成了类似攻击行 为

缓存击穿是大批量的请求在访问一个key,这个key失效的瞬间,请求打到了数据库 

缓存雪崩是大批量的请求在访问大批量的key,这些key同时失效,所有请求打到数据 库,造成数据库无法响应。

避免雪崩是给key加一个随机生存时间,例如都是 3分钟,给他们加一个random_int(1,30) 这样的时间,不会同时失效,或者热点数据长期有效,至少过完高并 发的这几天再失效。

避免穿透是接口层增加校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码

return,同时nginx层面限制ip请求频率。也可以借助布隆过滤器,从其中判断key存不 存在,不存在直接return ;

避免击穿最简单是让key长期有效。

4.PHP 查找两个有序数组的相同元素 还是双指针的经典妙用


   
  1. public function findTheSameItems($arr1,$arr2) {
  2.     $size1 = count($arr1);
  3.     $size2 = count($arr2);
  4.     $i = $j = 0;
  5.     $result = [];
  6.     while (true) {//移动值较小的
  7.         if ($arr1[$i] > $arr2[$j])
  8.             $j++;
  9.         elseif ($arr1[$i] < $arr2[$j])
  10.             $i++; else {
  11.             $result[] = $arr1[$i];
  12.             $j++; }
  13.         if ($i == $size1 || $j == $size2)
  14.             break;
  15.     }
  16.     return $result;
  17. }

配上二分查找的套路:


   
  1. <?php
  2. # 二分查找
  3. function binarySearch(array $arr, $target)
  4. {
  5.     $low = 0;
  6.     $high = count($arr) - 1;
  7.     while ($low <= $high) {
  8.         $mid = floor(($low + $high) / 2); # 找到元素
  9.         if ($arr[$mid] == $target) return $mid; # 中间元素比目标大,查找左边
  10.         if ($arr[$mid] > $target) $high = $mid - 1;
  11.     # 中间元素比右边小,查找右边
  12.         if ($arr[$mid] < $target) $low = $mid + 1;
  13.     }
  14.     #查找失败
  15.     return false;
  16. }

借助二分查找实现开根号计算:


   
  1. <?php
  2. function mySqrt($x)
  3. {
  4.     if ($x <= 1return $x;
  5.     $left = 1;
  6.     $right = $x - 1;
  7.     while ($left <= $right) {
  8.         $mid = $left + (($right - $left) >> 1);
  9.         if ($mid > $x / $mid) {
  10.             $right = $mid - 1;
  11.         } else if ($mid < $x / $mid) {
  12.             if ($mid + 1 > $x / ($mid + 1)) return $mid;
  13.             $left = $mid + 1;
  14.         } else {
  15.             return $mid;
  16.         }
  17.     }
  18.     return -1// only for return a value
  19. }

在聊天对话框内回复【激活码

即可获取最新idea激活码(实时更新)

-END-

右下角,您点赞和在看

小编工资涨2毛

3ae6ea6bcde2dbd8e6fff546d93084d3.gif

文章来源: blog.csdn.net,作者:lxw1844912514,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lxw1844912514/article/details/123124275

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。