共计 3672 个字符,预计需要花费 10 分钟才能阅读完成。
开篇介绍
大家好,我是 Java 最全面试题库
的提裤姐
,明天这篇是 Java 设计模式,次要总结了设计模式相干的问题,在后续,会沿着第一篇开篇的常识线路始终总结上来,做到日更!如果我能做到百日百更,心愿你也能够跟着百日百刷,一百天养成一个好习惯。
设计模式有哪些?
创立型
- 工厂模式与形象工厂模式(Factory Pattern)(Abstract Factory Pattern)
- 单例模式(Singleton Pattern)
- 建造者模式(Builder Pattern)
- 原型模式(Prototype Pattern)
结构型
- 适配器模式(Adapter Pattern)
- 装璜器模式(Decorator Pattern)
- 桥接模式(Bridge Pattern)
- 外观模式(Facade Pattern)
- 代理模式(Proxy Pattern)
- 过滤器模式(Filter、Criteria Pattern)
- 组合模式(Composite Pattern)
- 享元模式(Flyweight Pattern)
行为型
- 责任链模式(Chain of Responsibility Pattern)
- 观察者模式(Observer Pattern)
- 模板模式(Template Pattern)
- 命令模式(Command Pattern)
- 解释器模式(Interpreter Pattern)
- 迭代器模式(Iterator Pattern)
- 中介者模式(Mediator Pattern)
- 策略模式(Strategy Pattern)
- 状态模式(State Pattern)
- 备忘录模式(Memento Pattern)
- 空对象模式(Null Object Pattern)
JDK 类库罕用的设计模式有哪些?
- 工厂模式
- 适配器模式
- 代理模式
- 单例模式
- 装璜器
- 模板办法模式
Spring 中都应用了哪些设计模式?
- 代理模式:在 AOP 中有应用
- 单例模式:bean 默认是单例模式
- 模板办法模式:jdbcTemplate
- 工厂模式:BeanFactory
- 观察者模式:Spring 事件驱动模型就是观察者模式很经典的一个利用,比方,ContextStartedEvent 就是 ApplicationContext 启动后触发的事件
- 适配器模式:Spring MVC 中也是用到了适配器模式适配 Controller
Java 中什么叫单例设计模式?请用 Java 写出线程平安的单例模式
单例模式重点在于在整个零碎上共享一些创立时较耗资源的对象。整个利用中只保护一个特定类实例,它被所有组件独特应用。Java.lang.Runtime 是单例模式的经典例子。
动态外部类:
JVM 提供了同步控制性能:static final,利用 JVM 进行类加载的时候保证数据同步。
在内部类中创建对象实例,只有利用中不应用外部类,JVM 就不会去加载该类,就不会创立咱们要创立的单例对象。
public class StaticInnerSingleton {private StaticInnerSingleton(){ }
/**
* 在第一次加载 StaticInnerSingleton 时不会初始化 instance,* 只在第一次调用了 getInstance 办法时,JVM 才会加载 StaticInnerSingleton 并初始化 instance
* @return
*/
public static StaticInnerSingleton getInstance(){return SingletonHolder.instance;}
// 动态外部类
private static class SingletonHolder{private static final StaticInnerSingleton instance = new StaticInnerSingleton();
}
}
长处:JVM 自身机制保障了线程平安,没有性能缺点。
枚举:
public enum EnumSingleton {
// 定义一个枚举的元素,它就是 Singleton 的一个实例
INSTANCE;
public void doSomething(){}
}
留神:如果在枚举类中有其余实例办法或实例变量,必须确保是线程平安的。
应用工厂模式最次要的益处是什么?在哪里应用?
工厂模式的最大益处是减少了创建对象时的封装档次。如果你应用工厂来创建对象,之后你能够应用更高级和更高性能的实现来替换原始的产品实现或类,这不须要在调用层做任何批改。
什么是观察者设计模式(observer design pattern)?实现一个观察者设计模式。
观察者模式是定义对象间的一种 一对多
依赖关系,使得每当一个对象状态产生扭转时,其相干依赖对象皆失去告诉并被自动更新。观察者模式又叫做公布 - 订阅(Publish/Subscribe)模式、模型 - 视图(Model/View)模式、源 - 监听器(Source/Listener)模式或隶属者(Dependents)模式
长处
观察者模式能够实现表示层和数据逻辑层的拆散,并定义了稳固的音讯更新传递机制,形象了更新接口,使得能够有各种各样不同的表示层作为具体观察者角色;
观察者模式在察看指标和观察者之间建设一个形象的耦合;
观察者模式反对播送通信;
观察者模式合乎开闭准则(对拓展凋谢,对批改敞开)的要求。
毛病
如果一个察看指标对象有很多间接和间接的观察者的话,将所有的观察者都告诉到会破费很多工夫;
如果在观察者和察看指标之间有循环依赖的话,察看指标会触发它们之间进行循环调用,可能导致系统解体;
观察者模式没有相应的机制让观察者晓得所察看的指标对象是怎么发生变化的,而仅仅只是晓得察看指标产生了变动。
public class Subject {
private List<Observer> observers
= new ArrayList<Observer>();
private int state;
public int getState() {return state;}
public void setState(int state) {
this.state = state;
notifyAllObservers();}
public void attach(Observer observer){observers.add(observer);
}
public void notifyAllObservers(){for (Observer observer : observers) {observer.update();
}
}
}
public abstract class Observer {
protected Subject subject;
public abstract void update();}
public class BinaryObserver extends Observer{public BinaryObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Binary String:"
+ Integer.toBinaryString(subject.getState() ) );
}
}
public class OctalObserver extends Observer{public OctalObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Octal String:"
+ Integer.toOctalString(subject.getState() ) );
}
}
public class HexaObserver extends Observer{public HexaObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Hex String:"
+ Integer.toHexString(subject.getState() ).toUpperCase());
}
}
public class ObserverPattern {public static void main(String[] args) {Subject subject = new Subject();
new HexaObserver(subject);
new OctalObserver(subject);
new BinaryObserver(subject);
System.out.println("First state change: 15");
subject.setState(15);
System.out.println("Second state change: 10");
subject.setState(10);
}
}