> 文章列表 > 校招又临近了,怎么在面试中应对设计模式相关问题呢?

校招又临近了,怎么在面试中应对设计模式相关问题呢?

校招又临近了,怎么在面试中应对设计模式相关问题呢?

在这里插入图片描述

夏天开始了,那么夏天结束时的毕业季也不远了。毕业是个伤感、期待而又略带残酷的时节,就像蜜桃无论成熟与否都会在这个时间被采摘,如果毫无准备就踏入社会,就会……马上变成低级社畜。所以说还是要早点为了毕业找工作做点准备,不然等到毕业时间到来,就真的只剩心慌慌,不知道该怎么办了

01 | 准备

校招其实是对毕业生各方面的综合考量,其中包括基础知识、个人思维能力、临场反应能力等等。其中最重要的一点是实力才是硬道理,基础硬实力不过关,看再多“攻略”也无济于事,所以在前期准备阶段,首先要明确的一点就是夯实基础,然后才是针对性的扩展,最后就是调整好自己的心态,从容的面对每一场笔试面试

夯实基础

正所谓”万丈高楼平地起,一砖一瓦皆根基“,既然面试会问到设计模式,那么设计模式的基础(C++知识,操作系统)等也一定会同时出现,所以在学习设计模式之前,一定要先把基础给打好

  • C++基础:结合自己学习的过程以及群里老师的建议,总结如下学习/复习C++知识的方法

    1. 《C++ Primer 5》:入门经典之作,时间充裕的话可以过一遍,或者挑重点看(比如泛型百年城、继承于堕胎、模板与函数重载、C++11特性等)

    2. 《STL源码剖析》:面试C++岗位必问的内容,也是最近在群里老师提及并且自己也正打算看的内容,大概看了以下目录结构,对标设计模式的话就重点关注虚函数、多继承、虚继承的对象模式。看书觉得太烦躁的可以跟着小破站侯捷老师的课进行学习

  • 操作系统原理:设计模式中常遇到进程、线程、资源等相关问题,所以操作系统原理还是比较重要的

    1. 《UNIX环境高级编程》:系统编程的必读书籍,最近学习设计模式的时候也同时在看这本书中进程相关的知识模块,两者结合起来一起学习,效率更高

知识扩展

基础打好之后,也就保证了知识的基础深度,但是还欠缺知识的广度,也就是地基打好了,要开始盖楼了,比如现在要学的设计模式、之前学过的计算机网络编程等

  1. 设计模式:直接跟着老师的专栏《C++设计模式》进行学习,最好每一个类别的设计模式都自己动手执行一遍,照猫画虎也起码能跟着学到怎么画,纸上谈兵只会做无用功
    1. 《大话设计模式》:大话系列书籍,阅读起来还是很不错的,通俗易懂

  2. 计算机网络原理:我偏向于想做网络服务器方向的,所以就找书学了以下这块内容
    1. 《TCP/IP 详解 卷1》:深入理解TCP/IP协议栈的机制以其实现过程
    2. 《UNIX网络编程》:网络编程领域经典之作
    3. 《图解HTTP/图解TCP/IP》:图形化的方式描述协议栈的知识,通俗易懂

心态调整

心态也是面对各种问题的十分重要的一环,就像以前中学考试,小考十拿九稳,大考一上就慌,保持一个良好的心态,才能发挥自己本身的实力,甚至超常发挥。当然,这个阶段也要不断的夯实基础,可以多刷题,锻炼自己的解题能力,保证自己高度专注的精神力

在这里插入图片描述

02 | 热门

设计模式那么多!面试官会怎么问?_冯Jungle的博客-CSDN博客

参考上面老师的文章,以及问了一下面试过的朋友,整理了一下面试中可能会问到的与设计模式相关的问题以及解答

设计模式的种类?

设计模式分为三大类:创建型模式、结构型模式、行为型模式

  1. 创建型有种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式;

  2. 结构型有种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式;

  3. 行为型有十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式;

23种类型我目前也只学习了创建型模式,其他模式还没怎么看,所以到时候应该挑重点说,比如我得话就直接说”这23种类型中,我目前学习过的只有创建型模式,其他两类暂时还没有开始学习“,这样子就把面试官的重点扯到自己比较熟悉的模块上了

讲一下单例模式

单例模式是属于创建型模式中的应用十分广泛的一种,它的设计目的是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享,简单来说就是在整个软件运行的生命周期里,单例模式保证一个类只能产生一个实例,确保该类的唯一实例性

  1. 单例模式的设计理念是什么?

主要为了解决一个全局使用的类被频繁的创建和销毁,浪费系统资源,防止多线程环境中资源使用异常导致系统信息错乱、崩溃的情况

  1. 构造函数等为什么设计为私有?除了私有还有没有其他实现方法?

    1. 为了禁止外部构造和析构,禁止外部拷贝和赋值,确保实例的唯一性。所以将构造函数和析构函数以及拷贝构造和赋值构造函数设置为private类型

    2. 第二个问题只找到了这样一句话:”标准的单例模式,构造函数是需要私有化的,但是单例模式是一种思想,代码模式设计的目的是为了服务于业务的,可能某些特俗场景下,需要外界使用构造函数“

  2. 单例对象为什么设计为static,什么时候初始化,什么时候销毁?

    1. 为什么是static?

      1. 通过静态的类方法(getInstance) 获取instance,该方法是静态方法,instance由该方法返回(被该方法使用),如果instance非静态,无法被getInstance调用;
      2. instance需要在调用getInstance时候被初始化,只有static的成员才能在没有创建对象时进行初始化。且类的静态成员在类第一次被使用时初始化后就不会再被初始化,保证了单例;
      3. static类型的instance存在静态存储区,每次调用时,都指向的同一个对象
    2. 什么时候初始化?
      初始化的情况分两种,对应单例模式中的懒汉式、饿汉式

      1. 懒汉式:在需要使用时再初始化
      2. 饿汉式:程序开始时就初始化
    3. 什么时候销毁?
      我的理解是:单例模式全局只有一个实例,反复个体Instance不会增加内存,不会造成内存溢出,程序退出时内存会被系统释放

  3. 懒汉模式和饿汉模式的实现,以及c++11后懒汉模式的实现
    参考前面的笔记什么是单例模式?

  4. 加锁式懒汉模式中的”双检锁“为什么两次判空?

    1. 第一次判空:验证是否创建对象,判断为了避免不必要的同步
    2. 第二次判空:避免重复创建单例,因为可能会存在多个线程通过了第一次判断在等待锁,来创建新的实例对象

抽象工厂和工厂方法的区别

工厂方法模式是定义了一个创建对象的抽象方法,由子类决定要实例化的类。这样做的好处是再有新的类型的对象需要实例化只要增加子类即可。抽象工厂模式定义了一个接口用于创建对象族,而无需明确指定具体类。抽象工厂也是把对象的实例化交给了子类,即支持拓展。同时提供给客户端接口,避免了用户直接操作子类工厂。

享元模式

待学习后补充

观察者模式

待学习后补充

STL有了解嘛?具体讲一下

待整理

智能指针中的shared_ptr,手写shared_ptr

待整理