设计模式-面试题

一、实际应用

  • 项目中使用到的设计模式

    • 模板方法模式、工厂方法模式、外观模式、建造者模式
  • Spring中使用到的设计模式

    • 代理模式、单例模式、观察者模式

二、设计模式分类

设计模式(Design Pattern)是一套被反复使用、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被理解、提高代码的可靠性。

  • 创建型:主要用于创建对象,包括各种工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
  • 结构型:主要用于处理类和对象的组合。包括桥接模式、适配器模式、装饰者模式、代理模式、组合模式、外观模式、享元模式等。
  • 行为型:主要用于描述类或对象如何交互和怎样分配职责。包括策略模式、解释器模式、命令模式、观察者模式、迭代器模式、模板方法模式、访问者模式。

三、创建型

1、工厂方法模式(Factory Method)

  • 定义一个用于创建对象的接口,让子类决定将哪一个类实例化。
//创建接口
public interface Shape {  
    void draw();  
}

//具体实体类
public class Rectangle implements Shape {  
    @Override  
    public void draw() {  
        System.out.println("Inside Rectangle::draw() method.");  
    }  
}  
  
public class Square implements Shape {  
    @Override  
    public void draw() {  
        System.out.println("Inside Square::draw() method.");  
    }  
}  

//创建工厂生成具体实例
@Component  
public class ShapeFactory {  
    private Map<String, Shape> shapeMap = new HashMap<>();  
  
    public ShapeFactory() {  
        shapeMap.put("CIRCLE", new Circle());  
        shapeMap.put("RECTANGLE", new Rectangle());  
        shapeMap.put("SQUARE", new Square());  
    }  
  
    public Shape getShape(String shapeType){  
        return shapeMap.get(shapeType);  
    }  
}

2、抽象工厂模式(Abstract Factory)

  • 提供一个创建对象的接口,而无需指定它们具体的类。(创建多个工厂)
//创建接口
public interface Animal {  
    void speak();  
}

//具体实体类
public class Dog implements Animal {  
    @Override  
    public void speak() {  
        System.out.println("Woof!");  
    }  
}  
  
public class Cat implements Animal {  
    @Override  
    public void speak() {  
        System.out.println("Meow!");  
    }  
}

//抽象工厂
public abstract AnimalFactory {
    public abstract Animal createAnimal();  
}

//创建实现该抽象工厂类的具体工厂类:
public class DogFactory extends AnimalFactory {  
    @Override  
    public Animal createAnimal() {  
        return new Dog();  
    }  
}  

public class CatFactory extends AnimalFactory {  
    @Override  
    public Animal createAnimal() {  
        return new Cat();  
    }  
}

3、单例模式(Singleton)

  • 确保一个类只有一个实例,并提供一个全局访问点
  • 单例被破坏的场景
    • 反射、反序列化、克隆、指令重排、多线程
//饿汉式
public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton() {}  
    public static Singleton getInstance() {  
        return instance;  
    }  
}
//懒汉式
public class Singleton {  
    private static Singleton instance;  
    private Singleton() {}  
    public static synchronized Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}
//DCL
public class Singleton {  
    private volatile static Singleton instance;  
    private Singleton() {}  
    public static Singleton getInstance() {  
        if (instance == null) { // 第一次检查  
            synchronized (Singleton.class) {  
                if (instance == null) { // 第二次检查  
                    instance = new Singleton();  
                }  
            }  
        }  
        return instance;  
   

相关推荐

  1. 设计模式-面试

    2024-02-22 04:36:02       54 阅读
  2. 设计模式面试(一)

    2024-02-22 04:36:02       45 阅读
  3. 设计模式面试(二)

    2024-02-22 04:36:02       34 阅读
  4. 设计模式面试(七)

    2024-02-22 04:36:02       38 阅读
  5. 设计模式面试(六)

    2024-02-22 04:36:02       35 阅读
  6. 设计模式面试(九)

    2024-02-22 04:36:02       36 阅读
  7. 设计模式面试(八)

    2024-02-22 04:36:02       43 阅读
  8. 前端设计模式面试汇总

    2024-02-22 04:36:02       21 阅读
  9. 软件测试面试 | 什么是PO设计模式

    2024-02-22 04:36:02       57 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-22 04:36:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-22 04:36:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-22 04:36:02       82 阅读
  4. Python语言-面向对象

    2024-02-22 04:36:02       91 阅读

热门阅读

  1. Maya监听 DAG events

    2024-02-22 04:36:02       50 阅读
  2. 如何修改游戏中的ip地址

    2024-02-22 04:36:02       63 阅读
  3. 【Linux 内核源码分析】物理内存组织结构

    2024-02-22 04:36:02       53 阅读
  4. 开源软件的影响力

    2024-02-22 04:36:02       51 阅读
  5. QT常用事件

    2024-02-22 04:36:02       42 阅读
  6. 你知道什么是物联网MQTT么?

    2024-02-22 04:36:02       44 阅读