设计模式面试题
1、那些地方用到了单例模式
答:
- 网站的计数器,一般也是采用单例模式实现,否则难以同步。
- 应用程序的日志应用,一般都是单例模式实现,只有一个实例去操作才好,否则内容不好追加显示。
- 多线程的线程池的设计一般也是采用单例模式,因为线程池要方便对池中的线程进行控制
- Windows的(任务管理器)就是很典型的单例模式,他不能打开俩个
- windows的(回收站)也是典型的单例应用。在整个系统运行过程中,回收站只维护一个实例。
2、举一个用 .Net5中实现的装饰模式(decorator design pattern)?它是作用于对象层次还是类层次?
答:装饰模式增加强了单个对象的能力。.Net5 IO 到处都使用了装饰模式,典型例子就是 Buffered 系列类如 BufferedStream 它们增强了 Stream 对象, 以实现提升性能的 Buffer 层次的读取和写入。
3、适配器模式是什么?什么时候使用?
答:适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。适配器模式提供对接口的转换。如果你的客户端使用某些接口,但是你有另外一些接口,你就可以写一个适配去来连接这些接口。
4、适配器模式与装饰器模式有什么区别?
答:虽然适配器模式和装饰器模式的结构类似,但是每种模式的出现意图不同。适配器模式被用于桥接两个接口,而装饰模式的目的是在不修改类的情况下给类增加新的功能。
装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者模提供了比继承更有弹性的替代方案。
通俗的解释:装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。
适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
适配器模式有三种:类的适配器模式、对象的适配器模式、接口的适配器模式。
通俗的说法:适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。
5、适配器模式和代理模式之间有什么不同?
答:这个问题与前面的类似,适配器模式和代理模式的区别在于他们的意图不同。由于适配器模式和代理模式都是封装真正执行动作的类,因此结构是一致的,但是适配器模式用于接口之间的转换,而代理模式则是增加一个额外的中间层,以便支持分配、控制或智能访问。
6、使用工厂模式最主要的好处是什么?你在哪里使用?
答:工厂模式的最大好处是增加了创建对象时的封装层次。如果 你使用工厂来创建对象,之后你可以使用更高级和更高性能的实现来替换原始的产品实现或类,这不需要在调用层做任何修改。可以看我的文章工厂模式得更详细的解释和和了解更多的好处。
7、什么时候使用享元模式?
答:享元模式通过共享对象来避免创建太多的对象。为了使用享元模式,你需要确保你的对象是不可变的,这样你才能安全的共享。Net5中 String 池、Integer 池以及 Long 池都是很好的使用了享元模式的例子。
8、什么是责任链设计模式
答:责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
9、你可以说出几个在.Net5中使用的设计模式吗?
答:装饰器设计模式(Decorator design pattern)被用于多个.Net5 IO类中。单例模式(Singleton pattern)用于Runtime,Calendar和其他的一些类中。工厂模式(Factory pattern)被用于各种不可变的类如HttpClient,像HttpClientFactory,观察者模式(Observer pattern)被用于DiagnosticSource和很多的事件监听中。