【面试题】设计模式相关
来源:互联网 发布:mac版网络游戏 编辑:程序博客网 时间:2024/06/06 18:30
1.单例设计模式
使用设计模式为了代码复用,增加可维护性。
设计模式的六大原则:开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、迪米特法则(最少知道原则)、合成/聚合复用原则
Singleton(创建):保证一个类仅有一个实例,并提供一个访问它的全局访问点。如打印机
饿汉式单例模式
//饿汉模式:线程安全,耗费资源。public class HugerSingletonTest { //该对象的引用不可修改。还可以将对象的创建放到静态代码块中。 private static final HugerSingletonTest ourInstance = new HugerSingletonTest(); public static HugerSingletonTest getInstance() { return ourInstance; } private HugerSingletonTest() { }}
- 懒汉式:非线程安全
public class Singleton { private static Singleton ourInstance; public static Singleton getInstance() { if (null == ourInstance) { ourInstance = new Singleton(); } return ourInstance; } private Singleton() { }}
- 懒汉式,线程安全:给方法加锁,消耗资源。
public class Singleton { private static Singleton ourInstance; public synchronized static Singleton getInstance() { if (null == ourInstance) { ourInstance = new Singleton(); } return ourInstance; } private Singleton() { }}
- 懒汉式,线程安全:双重检查锁。
public class Singleton { private static Singleton ourInstance; public synchronized static Singleton getInstance() { if (null == ourInstance) { synchronized (Singleton.class) { if (null == ourInstance) { ourInstance = new Singleton(); } } } return ourInstance; } private Singleton() { }}
分析:JVM会进行指令重排序,原本的步骤应该是先给 singleton 分配内存,然后调用 Singleton 的构造函数来初始化成员变量,形成实例,最后将singleton对象指向分配的内存空间,但有可能步骤会打乱,就会出现实例非空但没有初始化,抛出异常。将singleton声明成 volatile ,就可以解决该问题。
懒汉式,线程安全:静态内部类
public class Singleton { private static class SingletonHodler { private static Singleton ourInstance = new Singleton(); } public synchronized static Singleton getInstance() { return SingletonHodler.ourInstance; } private Singleton() { }}
- 懒汉式,线程安全:枚举
enum SingletonTest { INSTANCE; }
- 单例模式在JDK8源码中的使用:Runtime.getRuntime()方法(饿汉式单例模式)
2.适配器设计模式
适配器模式(结构)中的角色:目标接口(Target):客户所期待的接口、需要适配的类(Adaptee)、适配器(Adapter)。
对象适配器(采用对象组合方式实现)
//适配器类实现了目标接口public class Adapter implements Target{ private Adaptee adaptee ; public Adapter() { super(); this.adaptee = new Adaptee(); } @Override public void getHeadset2() { adaptee.getHeadset3(); } public static void main(String args[]){ Target target = new Adapter(); //表面上调用的是2孔插座方法,但其实调用的三孔插座方法。 target.getHeadset2(); }}interface Target{ //两孔插座 void getHeadset2();}class Adaptee{ public void getHeadset3(){ System.out.println("我是三孔插座!"); }}
- 适配器模式在JDK源码的使用
- Arrays.asList(),其中Arrays是目标类,内部类ArrayList是适配器类,而Objects.requireNonNull(array);需要适配的类。
- InputStreamReader .read(),其中Reader 是目标类,InputStreamReader是适配器类,而StreamDecoder 是需要适配的类。
3.模板方法设计模式
模板方法设计模式(行为)使用了继承机制,在抽象类中定义一个模板方法,该方法引用了若干个抽象方法(由子类实现)或具体方法(子类可以覆盖重写)
模板方法设计模式在JDK源码的使用:Collections.sort()、InputStream.read()等
本人才疏学浅,若有错,请指出,谢谢!
如果你有更好的建议,可以留言我们一起讨论,共同进步!
衷心的感谢您能耐心的读完本篇博文!
阅读全文
0 0
- 【面试题】设计模式相关
- Android 设计模式相关面试题
- 设计模式面试题
- 设计模式面试题
- 设计模式面试题
- 常见设计模式面试题
- 设计模式常见面试题
- 设计模式常见面试题
- 设计模式常见面试题
- 设计模式常见面试题
- java面试题-设计模式
- Java 设计模式面试题
- 笔试/面试题_设计模式
- Java设计模式面试题2则
- 两道设计模式的面试题
- 两道设计模式的面试题
- 单例设计模式 面试题
- Java常见设计模式面试题
- sqlzoo练习答案--SELECT names/zh
- QT类学习系列(2)
- iOS_NSPredicate的使用
- 著名的Facebook高管因担心机器人接管世界辞职隐居,你难道不怕吗?
- 算法学习笔记--1. Two Sum
- 【面试题】设计模式相关
- C#中String s1 = null;String s2 = “” 的区别
- 信息安全快讯2017年8月第1期
- TypeAdapter介绍[L]
- -[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object' 解决方法
- 常用对话框
- Spring与Struts
- CodeForces
- 一个很好用的圆形头像控件.