设计模式面试系列-02

1. Java 中工厂模式有什么优势?

1、工厂模式是最常用的实例化对象模式,是用工厂方法代替new操作的一种模式。

2、利用工厂模式可以降低程序的耦合性,为后期的维护修改提供了很大的便利。

3、将选择实现类、创建对象统一管理和控制,从而将调用者跟我们的实现类解耦。

2. 说说你理解的 Spring 中工厂模式?

Spring IOC

看过Spring源码就知道,在Spring IOC容器创建bean的过程是使用了工厂设计模式。

Spring中无论是通过xml配置还是通过配置类还是注解进行创建bean,大部分都是通过简单工厂来进行创建的。

当容器拿到了beanName和class类型后,动态的通过反射创建具体的某个对象,最后将创建的对象放到Map中。

3. 为什么 Spring IOC 要使用工厂模式创建 Bean?

在实际开发中,如果A对象调用B,B调用C,C调用D的话,程序的耦合性就会变高。耦合大致分为类与类之间的依赖,方法与方法之间的依赖。

以前三层架构编程时,都是控制层调用业务层,业务层调用数据访问层时,都是是直接new对象,耦合性大大提升,代码重复量大、冗余高,对象也是创建比较随意。

为了避免这种情况,Spring使用工厂模式编写一个工厂,由工厂创建Bean,以后如果要对象就直接管工厂要就可以。

Spring IOC容器的工厂中有个静态的Map集合,是为了让工厂符合单例设计模式,即每个对象只生产一次,生产出对象后就存入到Map集合中,保证了实例不会重复影响程序效率。

4. Java 中工厂模式分为哪几大类?

工厂模式分为三类,如下:

1)简单工厂模式(Simple Factory),又称静态工厂方法模式,是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的, 不利于产生系列产品;

2)工厂方法模式(Factory Method),又称为多形性工厂是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成;

3)抽象工厂模式(Abstract Factory),又称为工具箱,提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构,产生产品族但不利于产生新的产品,而工厂方法模式针对的是一个产品的等级结构。

5. Java 中什么是简单工厂模式?

简单工厂模式又称静态工厂方法模式,在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化,如同一个交通警察站在来往的车辆流中,决定放行那一个方向的车辆向那一个方向流动一样。

简单工厂模式的具体组成如下:

1)工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑,用来创建产品。

2)抽象产品角色:它一般是具体产品继承的父类或者实现的接口。

3)具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

下面举例猫与狗吃饭的故事,具体代码实现如下:

1)创建共用接口,代码如下:

package com.yoodb;
 
public interface Dinner{
    public void eat();
}

2)创建实现类,代码如下:

package com.yoodb;
 
public class CatDinner implements Dinner{
 
    @Override
    public void eat() {
        // TODO Auto-generated method stub
        System.out.println("小猫来吃饭了!");
    }
 
}

package com.yoodb;
 
public class DogDinner implements Dinner{
 
    @Override
    public void eat() {
        // TODO Auto-generated method stub
        System.out.println("小狗来吃饭了!");
    }
     
}

3)创建工厂,代码如下:

package com.yoodb;
 
public class DinnerFactory {
     
    public Dinner produce(String animal){
        if(animal.equals("cat")){
            return new CatDinner();
        }else if(animal.equals("dog")){
            return new DogDinner();
        }else{
            System.out.println("请输入存在的动物!");  
    

相关推荐

  1. 设计模式面试系列-02

    2024-02-21 13:40:01       32 阅读
  2. 架构设计面试系列-01

    2024-02-21 13:40:01       39 阅读
  3. JVM面试系列-02

    2024-02-21 13:40:01       31 阅读
  4. MySQL面试系列-02

    2024-02-21 13:40:01       29 阅读
  5. Redis面试系列-02

    2024-02-21 13:40:01       32 阅读
  6. MongoDB面试系列-02

    2024-02-21 13:40:01       33 阅读
  7. Linux面试系列-02

    2024-02-21 13:40:01       31 阅读
  8. MyBatis面试系列-02

    2024-02-21 13:40:01       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-21 13:40:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-21 13:40:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-21 13:40:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-21 13:40:01       20 阅读

热门阅读

  1. 数学物理方法笔记——Γ函数

    2024-02-21 13:40:01       66 阅读
  2. 开源大数据管理平台选型

    2024-02-21 13:40:01       24 阅读
  3. 一些用 GPT 翻译的计算机科学/人工智能 PDF 讲义

    2024-02-21 13:40:01       32 阅读
  4. 代码随想录算法训练营总结

    2024-02-21 13:40:01       29 阅读
  5. CSS中伪元素和伪类的区别和作用?

    2024-02-21 13:40:01       30 阅读
  6. GO框架基础 (三)、xorm库

    2024-02-21 13:40:01       31 阅读
  7. LeetCode刷题笔记之二叉树(二)

    2024-02-21 13:40:01       23 阅读
  8. 【Lazy ORM 高级映射】1.2.2-JDK17-SNAPSHOT

    2024-02-21 13:40:01       27 阅读
  9. OpenCart程序结构与业务逻辑

    2024-02-21 13:40:01       33 阅读
  10. 【Python】OpenCV-图像滤波

    2024-02-21 13:40:01       29 阅读
  11. *EtherCAT:网络小能手,工业界的速度之星!**

    2024-02-21 13:40:01       26 阅读
  12. list.stream().forEach()和list.forEach()的区别

    2024-02-21 13:40:01       25 阅读
  13. C++ 基础算法 高精度乘法

    2024-02-21 13:40:01       25 阅读