1. 说说几个常见的设计模式(23种设计模式)?
2. 设计一个工厂的包的时候会遵循哪些原则?
3. 列举一个使用了 Visitor/ Decorator模式的开源项目/库?
4. 如何实现一个单例?
5. 代理模式(动态代理)?
6. 单例模式(懒汉模式,恶汉模式,并发初始化如何解决, volatile与lock的使用)?
7. JDK源码里面都有些什么让你印象深刻的设计模式使用,举例看看?
设计模式六大原则
1.开放封闭原则:对扩展开放,对修改封闭,意即程序拓展时不要动原有的代码
2.LSP原则:任何基类可以出现的地方,子类一定可以出现
3.依赖倒置原则:使用接口,依赖于抽象而不是具体
4.接口隔离原则:为了解耦,使用多个相互隔离的接口
5.迪米特法则:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
6.CRP法则:尽量使用合成/聚合的方式,而不是使用继承。
分类
1.创建型模式(在创建对象的过程中尽量隐藏创建细节,不直接使用new)
工厂模式(Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)
单例模式(Singleton Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
2.结构型模式(主要关注类和对象的继承、组合)
适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
过滤器模式(Filter、Criteria Pattern)
组合模式(Composite Pattern)
装饰器模式(Decorator Pattern)
外观模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
3.行为型模式(关注对象之间的通信)
责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
备忘录模式(Memento Pattern)
观察者模式(Observer Pattern)
状态模式(State Pattern)
空对象模式(Null Object Pattern)
策略模式(Strategy Pattern)
模板模式(Template Pattern)
访问者模式(Visitor Pattern)
单例模式:
单例模式就是在它的核心结构中只包含一个被称为单例类的特殊类,通过构造函数私有化和静态块以及提供对外访问的接口来实现.
饿汉模式:单例实例在类的加载中就被创建,不需要判断,安全。
懒汉模式:单例实例在第一次使用时就被创建,需要被判断,不安全。
应用场景:如果希望在系统中某个类的对象只存在一个,单例模式是最好的选择。
工厂模式:
工厂模式主要是为创建对象提供了接口。
应用场景如下:
(1):在编码时不能预见需要创建那种类的实例。
(2):系统不依赖于产品类的实例如何创建,组合和表达的细节
观察者模式:
观察者模式就是定义了对象间的一对多的依赖关系,当一个对象改变状态时,它的所有的依赖者都随之改变。
应用场景如下:
(1):对一个对象状态的更新,需要其他对象的同步更新,而且其他对象的数量动态可变
(2):对象仅仅需要把自己的更新通知给其他对象而不需要知道其他对象的细节。
迭代器模式:
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。
应用场景如下:
当你需要访问一个聚集对象,而且不管这些对象是什么都需要要遍历的时候,就应该考虑用迭代器模式。其实stl容器就是很好的迭代器模式的例子。
代理模式:
为其他对象提供代理来控制该对象的访问
应用场景:
Nginx的反向代理运行的就是代理模式
适配器模式:
将一类接口转换成客户希望的另外一个接口,Adapter模式使原本由于接口不兼容而不能一起工作的那些类可以一起工作了。
应用场景:
别人开发的控件要用咱们的应用服务,这时候适配器模式就起作用了,让不兼容变为兼容。