• 设计模式-面试题


    一、实际应用

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

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

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

    二、设计模式分类

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

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

    三、创建型

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

    • 定义一个用于创建对象的接口,让子类决定将哪一个类实例化。
    1. //创建接口
    2. public interface Shape {
    3. void draw();
    4. }
    5. //具体实体类
    6. public class Rectangle implements Shape {
    7. @Override
    8. public void draw() {
    9. System.out.println("Inside Rectangle::draw() method.");
    10. }
    11. }
    12. public class Square implements Shape {
    13. @Override
    14. public void draw() {
    15. System.out.println("Inside Square::draw() method.");
    16. }
    17. }
    18. //创建工厂生成具体实例
    19. @Component
    20. public class ShapeFactory {
    21. private Map shapeMap = new HashMap<>();
    22. public ShapeFactory() {
    23. shapeMap.put("CIRCLE", new Circle());
    24. shapeMap.put("RECTANGLE", new Rectangle());
    25. shapeMap.put("SQUARE", new Square());
    26. }
    27. public Shape getShape(String shapeType){
    28. return shapeMap.get(shapeType);
    29. }
    30. }

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

    • 提供一个创建对象的接口,而无需指定它们具体的类。(创建多个工厂)
    1. //创建接口
    2. public interface Animal {
    3. void speak();
    4. }
    5. //具体实体类
    6. public class Dog implements Animal {
    7. @Override
    8. public void speak() {
    9. System.out.println("Woof!");
    10. }
    11. }
    12. public class Cat implements Animal {
    13. @Override
    14. public void speak() {
    15. System.out.println("Meow!");
    16. }
    17. }
    18. //抽象工厂
    19. public abstract AnimalFactory {
    20. public abstract Animal createAnimal();
    21. }
    22. //创建实现该抽象工厂类的具体工厂类:
    23. public class DogFactory extends AnimalFactory {
    24. @Override
    25. public Animal createAnimal() {
    26. return new Dog();
    27. }
    28. }
    29. public class CatFactory extends AnimalFactory {
    30. @Override
    31. public Animal createAnimal() {
    32. return new Cat();
    33. }
    34. }

    3、单例模式(Singleton)

    • 确保一个类只有一个实例,并提供一个全局访问点
    • 单例被破坏的场景
      • 反射、反序列化、克隆、指令重排、多线程
    1. //饿汉式
    2. public class Singleton {
    3. private static Singleton instance = new Singleton();
    4. private Singleton() {}
    5. public static Singleton getInstance() {
    6. return instance;
    7. }
    8. }
    9. //懒汉式
    10. public class Singleton {
    11. private static Singleton instance;
    12. private Singleton() {}
    13. public static synchronized Singleton getInstance() {
    14. if (instance == null) {
    15. instance = new Singleton();
    16. }
    17. return instance;
    18. }
    19. }
    20. //DCL
    21. public class Singleton {
    22. private volatile static Singleton instance;
    23. private Singleton() {}
    24. public static Singleton getInstance() {
    25. if (instance == null) { // 第一次检查
    26. synchronized (Singleton.class) {
    27. if (instance == null) { // 第二次检查
    28. instance = new Singleton();
    29. }
    30. }
    31. }
    32. return instance;
  • 相关阅读:
    【文件编码转换】将GBK编码项目转为UTF-8编码项目
    LQ0272 矩形运算【计算几何】
    如何做好一次代码审查,什么样是一次优秀的代码审查,静态代码分析工具有哪些
    林沛满-Wireshark的提示
    CentOS(5)——rpm包和源码包区别
    面了一位5年老测试哥们,只会功能测试,敢要17K薪资,自认为挺牛逼的......
    Cesium快速上手1-CesiumWidget-Scene结构
    通过memberlist库实现gossip管理集群以及集群数据交互
    笔记本安装Ubuntu16.04双系统+nvidia显卡双屏显示+ros+turtlebot3仿真-环境搭建-221128-亲测可用
    html基本标签
  • 原文地址:https://blog.csdn.net/HBryce24/article/details/136191624