欢迎光临散文网 会员登陆 & 注册

过关斩将之路-设计模式

2023-06-08 08:41 作者:IT枫斗者-跳蚤网  | 我要投稿

hello大家,因之前有位学员在面试过程中被问到了“熟悉哪些设计模式”,她回答的不多,所以今天将跟大家介绍一些设计模式。

1、什么是单例模式?

单例模式是一种常用的软件设计模式,在应用这个模式时,单例对象的类必须保证只有一个实例存在,整个系统只能使用一个对象实例。

优点:不会频繁地创建和销毁对象,浪费系统资源。

可能这会需要你手写一个单例模式,这就得自己去学了,因为单例模式有很多种写法,懒汉模式,饿汉模式,双重检查模式等。懒汉模式就是用的时候再去创建对象,饿汉模式就是提前就已经加载好的静态static对象,双重检查模式就是两次检查避免多线程造成创建了多个对象。

单例模式有很多种的写法,我总结一下:

  • 饿汉式单例模式的写法:线程安全

  • 懒汉式单例模式的写法:非线程安全

  • 双检锁单例模式的写法:线程安全

2、什么是代理模式

代理模式是给某一个对象提供一个代理,并由代理对象控制对原对象的引用。

优点

  • 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度;

  • 可以灵活地隐藏被代理对象的部分功能和服务,也增加额外的功能和服务。

缺点

  • 由于使用了代理模式,因此程序的性能没有直接调用性能高;

  • 使用代理模式提高了代码的复杂度。


3、什么是简单工厂模式?

简单工厂模式又叫静态工厂方法模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。

优点:

  • 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象;

  • 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量;

  • 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

缺点:

  • 不易拓展,一旦添加新的产品类型,就不得不修改工厂的创建逻辑;

  • 产品类型较多时,工厂的创建逻辑可能过于复杂,一旦出错可能造成所有产品的创建失败,不利于系统的维护。

4、什么是抽象工厂模式?

抽象工厂模式是在简单工厂的基础上将未来可能需要修改的代码抽象出来,通过继承的方式让子类去做决定。


5、什么是装饰器模式?

装饰器模式是指动态地给一个对象增加一些额外的功能,同时又不改变其结构。

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

装饰器模式的关键:装饰器中使用了被装饰的对象

比如,创建一个对象“gebilaowang”,给对象添加不同的装饰,穿上夹克、戴上帽子......,这个执行过程就是装饰者模式。

一句名言:人靠衣裳马靠鞍。都是装饰器模式的生活案列

6、代理模式和装饰器模式有何不同?

它们都是结构型模式,但侧重点不同:代理模式重在访问权限的控制,而装饰器模式重在功能的加强。

7、知道模板方法模式嘛?

模板方法模式是指定义一个算法骨架,将具体内容延迟到子类去实现。

优点:

  • 提高代码复用性:将相同部分的代码放在抽象的父类中,而将不同的代码放入不同的子类中;

  • 实现了反向控制:通过一个父类调用其子类的操作,通过对子类的具体实现扩展不同的行为,实现了反向控制并且符合开闭原则。

    打个比方:喝茶:烧水----放入茶叶---喝茶。放入的茶叶每个人自己的喜好不一样,有的是普洱、有的是铁观音等。

8、知道享元模式吗?

顾名思义就是被共享的单元。享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象

具体来讲,当一个系统中存在大量重复对象的时候,如果这些重复的对象是不可变对象,我们就可以利用享元模式将对象设计成享元,在内存中只保留一份实例,供多处代码引用。这样可以减少内存中对象的数量,起到节省内存的目的。

9、享元模式和单列模式的区别在哪?

单例模式是创建型模式,重在只能有一个对象。而享元模式是结构型模式,重在节约内存使用,提升程序性能。

享元模式:把一个或者多个对象存起来,用的时候,直接从缓存里获取。也就是说享元模式不一定只有一个对象。

10、什么是策略模式?

策略模式是指定义一系列算法,将每个算法都封装起来,并且使他们之间可以相互替换。

优点:遵循了开闭原则,扩展性良好。

缺点:随着策略的增加,对外暴露越来越多。

我们去拉萨的交通方式(策略)很多,比如说坐飞机、坐高铁、自己开车等方式。每一种方式就可以理解为每一种策略。

这就是生活中的策略模式。

11、了解适配器模式嘛?

适配器模式是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够在一起工作。

优点:

  • 可以让两个没有关联的类一起运行,起着中间转换的作用;

  • 灵活性好,不会破坏原有的系统。

缺点:过多地使用适配器,容易使代码结构混乱,如明明看到调用的是 A 接口,内部调用的却是 B接口的实现。

生活中的插座,为了适应各种插头,然后上面有两个孔的,三个空的,基本都能适应。还有万能充电器、USB接口等。这些都是生活中的适配器模式

12、了解观察者模式嘛?

观察者模式是定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

优点:

  • 观察者模式可以实现表示层和数据逻辑层的分离,并定义了稳定的消息更新传递机制,抽象了

  • 更新接口,使得可以有各种各样不同的表示层作为具体观察者角色;

  • 观察者模式在观察目标和观察者之间建立一个抽象的耦合;

  • 观察者模式支持广播通信;

  • 观察者模式符合开闭原则(对拓展开放,对修改关闭)的要求。

缺点:

  • 如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间;

  • 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃;

  • 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

以上这些设计模式能应对绝大多数人和面试场景。建议私下自己用代码实现一番,便于更好地理解。

过关斩将之路-设计模式的评论 (共 条)

分享到微博请遵守国家法律