你们好,我是Java最全面试题库
的提裤姐
,今天这篇是Java设计模式,主要总结了设计模式相关的问题,在后续,会沿着第一篇开篇的知识线路一直总结下去,作到日更!若是我能作到百日百更,但愿你也能够跟着百日百刷,一百天养成一个好习惯。java
建立型面试
结构型设计模式
行为型安全
单例模式重点在于在整个系统上共享一些建立时较耗资源的对象。整个应用中只维护一个特定类实例,它被全部组件共同使用。Java.lang.Runtime 是单例模式的经典例子。ide
静态内部类:
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自己机制保证了线程安全,没有性能缺陷。
枚举:ui
public enum EnumSingleton { //定义一个枚举的元素,它就是Singleton的一个实例 INSTANCE; public void doSomething(){ } }
注意:若是在枚举类中有其余实例方法或实例变量,必须确保是线程安全的。
工厂模式的最大好处是增长了建立对象时的封装层次。若是你使用工厂来建立对象,以后你可使用更高级和更高性能的实现来替换原始的产品实现或类,这不须要在调用层作任何修改。this
观察者模式是定义对象间的一种一对多
依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆获得通知并被自动更新。观察者模式又叫作发布-订阅(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); } }