1、说下你知道的设计模式有哪些?

下面 3 种类型中各挑几个常见的或者你用过的说就可以了。
图片

2、工厂方法模式和抽象工厂模式有什么区别?

  • 工厂方法模式:

一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类只能创建一个具体产品类的实例。

  • 抽象工厂模式:

多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类可以创建多个具体产品类的实例。

  • 区别:

工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

3、JDK 中用到了哪些设计模式?

几乎每一种设计模式都被用到了 JDK 的源码中,下面列举一些常见的:

  • 抽象工厂模式
    ```java
    1. javax.xml.parsers.DocumentBuilderFactory#newInstance()
    1. javax.xml.transform.TransformerFactory#newInstance() ```
  • 建造者模式
    ```java
    1. java.lang.StringBuilder#append()
    1. java.lang.StringBuffer#append() ```
  • 原型模式
    ```java
  1. java.lang.Object#clone() ```
  • 适配器模式
    ```java
    1. java.util.Arrays#asList()
    1. java.util.Collections#list() ```
  • 装饰器模式
    ```java
    1. IO 流的子类
    1. java.util.Collections#synchronizedXXX() ```
  • 享元模式
    ```java
  1. java.lang.Integer#valueOf(int) ```
  • 代理模式
  1. 1. 1. java.lang.reflect.Proxy
  2. 2. 2. javax.inject.Inject
  • 责任链模式
    ```java
    1. java.util.logging.Logger#log()
    1. javax.servlet.Filter#doFilter()……

      4、Spring 中用到了哪些设计模式?

  1. 单例设计模式 : Spring 中的 Bean 默认都是单例的;
    2. 代理设计模式 : Spring AOP 功能的实现;
    3. 工厂设计模式 : Spring 使用工厂模式通过 BeanFactory、ApplicationContext 创建 Bean 对象;
    4. 模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式;
    5. 装饰器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源;
    6. 观察者模式:Spring 事件驱动模型就是观察者模式很经典的一个应用;
    7. 适配器模式:Spring AOP 的增强或通知(Advice)使用到了适配器模式、SpringMVC 中也是用到了适配器模式适配 Controller。

    5、设计模式六大原则是什么?

  2. 单一职责原则:一个方法 一个类只负责一个职责,各个职责的程序改动,不影响其它程序。
    2. 开闭原则:对扩展开放,对修改关闭。即在不修改一个软件实体的基础上去扩展其他功能。
    3. 里氏代换原则:在软件系统中,一个可以接受基类对象的地方必然可以接受一个子类对象。
    4. 依赖倒转原则:针对于接口编程,依赖于抽象而不依赖于具体。
    5. 接口隔离原则:使用多个隔离的接口取代一个统一的接口。降低类与类之间的耦合度。
    6. 迪米特原则:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。

    7. 单例模式的优缺点?

  • 优点:

由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。

  • 缺点:

由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。

8、请手写一下单例模式?

  • **
    ```java
  1. public class Singleton {
  2. private static Singleton instance;
  3. private Singleton(){ };
  4. public static synchronized Singleton getInstance(){
  5. if(instance == null){
  6. instance = new Singleton();
  7. }
  8. return instance;
  9. }
  10. } ```

2. 饿汉式:初始化时即创建,用到时直接返回

1. public class Singleton {    
2. private static  Singleton instance = new Singleton();    
3. private Singleton(){};    
4. 
5. public static Singleton getInstance(){    
6. return instance;    
7. }    
8. }

  • ```java
  1. public class Singleton {
  2. private static class SingletonHolder{
  3. private static final Singleton INSTTANCE = new Singleton();
  4. }
  5. private Singleton(){};
  6. public static final Singleton getInstance(){
  7. return SingletonHolder.INSTTANCE;
  8. }
  9. } ```

4. 双重校验锁【推荐】

1. public class Singleton {    
2.     private volatile static Singleton singleton;     
3. private Singleton(){};    
4. 
5. public static Singleton getSingleton(){    
6. if(singleton == null){    
7. synchronized(Singleton.class){    
8. if(singleton == null){    
9. singleton = new Singleton();    
10. }    
11. }    
12. }    
13. return singleton;    
14. }     
15. }

采用的是组合模式。树形结构在软件中随处可见,例如:操作系统中的目录结构、应用软件中的菜单、办公系统中的公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题,组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形结构或者树形结构的一部分,也可以一致性地处理树形结构中的叶子节点(不包含子节点的节点)和容器节点(包含子节点的节点)。