Java 深入探究讲解工厂方法模式

 更新时间:2022年04月06日 18:14:15   作者:静静子♡  
工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂、具体工厂、抽象产品、具体产品

1. 工厂方法模式介绍

定义:工厂方法模式是对简单工厂模式进一步的抽象化,好处是可以使系统不修改原来代码的情况下引进新的产品,即满足开闭原则。定义一个用于创建对象接口,让子类决定实例化哪一个类,使一个类的实例化延迟到子类中。

2. 工厂方法模式类图UML

img

3. 工厂方法模式角色说明

抽象工厂(AbstractFactory):提供了创建产品的接口,调用方通过它访问具体工厂的工厂方法来创建产品

具体工厂(ConcreteFactory):实现了抽象工厂定义的方法,完成具体产品的创建

抽象产品(Product):定义了产品的规范,描述产品的主要特征和性能

具体产品(ConcreteProduct):实现了抽象产品的定义的方法,有具体工厂来创建产品,具体工厂和具体产品一一对应

4. 代码实现

工厂方法模式实现:

/**
 * 抽象工厂:提供具体工厂的共有方法
 */
public interface Product {
    public void show();
}
​
public class ConcreteProduct1 implements Product {
    @Override
    public void show() {
        System.out.println("具体产品1展示...");
    }
}
​
public class ConcreateProduct2 implements Product {
    @Override
    public void show() {
        System.out.println("具体产品2展示...");
    }
}
​
​
/**
 * 抽象工厂
 */
public interface AbstractFactory {
    public Product createProduct();
}
​
/**
 * 具体工厂1产生具体产品1
 */
public class ConcreteFactory1 implements AbstractFactory {
    @Override
    public Product createProduct() {
        ConcreteProduct1 concreteProduct1 = new ConcreteProduct1();
        System.out.println("具体工厂1创建具体产品1...");
        return concreteProduct1;
    }
    
public class ConcreteFactory2 implements AbstractFactory {
    @Override
    public Product createProduct() {
        System.out.println("具体工厂2产生具体产品2...");
        return new ConcreateProduct2();
    }
}

调用方法:

        //获取具体产品1
        Product product = new ConcreteFactory1().createProduct();
        product.show();
​
        Product product1 = new ConcreteFactory2().createProduct();
        product1.show();

使用步骤:

  • 创建抽象产品类,定义产品的公共方法
  • 创建具体产品类(实现抽象产品接口),定义生成的具体产品
  • 创建抽象工厂类,定义具体工厂的公共接口
  • 创建具体工厂类,定义创建对应具体产品实例的方法
  • 调用方调用具体的工厂类的方法,从而创建不同具体产品的实例

5. 工厂模式再探究

解决问题:解决了简单工厂类新增产品需要修改工厂类的方法逻辑问题,即为别开闭原则。

将具体的产品创建退出到工厂类的子类(具体工厂),此时工厂类不再负责所有产品的创建,而是给出具体工厂必须实现的接口,这样工厂方法在添加新的产品的时候,就不需要修改工厂类的逻辑,而是添加了新的工厂子类,符合开闭原则。

6. 优缺点

优点:

  • 灵活性强,对于新产品的创建,只需要多写一个对应的工厂类
  • 用户只需要指导工厂的名称就可以获得所要的产品,不需要指导产品具体创建过程

缺点:

  • 类的个数容易过多,增加了复杂度
  • 每一个工厂只能生产一种产品,次弊端可以使用抽象工厂模式解决

7. 应用场景

客户只关注创建产品的工厂名,不需要知道具体的产品名称

到此这篇关于Java 深入探究讲解工厂方法模式的文章就介绍到这了,更多相关Java 工厂方法 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#中NAudio音频库的安装与使用教程详解

    C#中NAudio音频库的安装与使用教程详解

    NAudio为.NET平台下的开源库,采用ML-PL协议,它支持许多音频操作,可实现多种API播放与录制、多种不同音频格式等功能,下面就跟随小编一起学习一下NAudio的安装与使用吧
    2023-11-11
  • 详解springcloud 基于feign的服务接口的统一hystrix降级处理

    详解springcloud 基于feign的服务接口的统一hystrix降级处理

    这篇文章主要介绍了详解springcloud 基于feign的服务接口的统一hystrix降级处理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • Java利用Jackson序列化实现数据脱敏

    Java利用Jackson序列化实现数据脱敏

    这篇文章主要介绍了利用Jackson序列化实现数据脱敏,首先在需要进行脱敏的VO字段上面标注相关脱敏注解,具体实例代码文中给大家介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • spring boot常见get 、post请求参数处理、参数注解校验、参数自定义注解校验问题解析

    spring boot常见get 、post请求参数处理、参数注解校验、参数自定义注解校验问题解析

    这篇文章主要介绍了spring boot常见get 、post请求参数处理、参数注解校验、参数自定义注解校验,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • java 多态性详解及常见面试题

    java 多态性详解及常见面试题

    这篇文章主要介绍了java 多态性详解及常见面试题的相关资料,这里对java 的多态性做了资料整理,并列举常见的关于多态性的面试题,需要的朋友可以参考下
    2016-11-11
  • ResultSet如何动态获取列名和值

    ResultSet如何动态获取列名和值

    这篇文章主要介绍了ResultSet如何动态获取列名和值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 关于Unsupported Media Type的解决方案

    关于Unsupported Media Type的解决方案

    在Web开发中,415错误表示服务器无法处理请求附带的媒体格式,本文介绍了导致HTTP 415错误的原因以及解决该问题的两种方法,首先,415错误通常是由于客户端请求的内容类型与服务器期望的不匹配引起的,例如,服务器可能期望JSON格式的数据
    2024-10-10
  • 谈谈Java中自定义注解及使用场景

    谈谈Java中自定义注解及使用场景

    这篇文章主要介绍了谈谈Java中自定义注解及使用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 深度剖析Java成员变量、局部变量和静态变量的创建和回收时机

    深度剖析Java成员变量、局部变量和静态变量的创建和回收时机

    这篇文章主要介绍了深度剖析Java成员变量、局部变量和静态变量的创建和回收时机,成员变量是定义在类中的变量,每个类的实例都会拥有自己的成员变量。它们的生命周期与对象的创建和销毁相对应,下面我将详细介绍它们的特点和生命周期,需要的朋友可以参考下
    2023-07-07
  • IntelliJ IDEA下SpringBoot如何指定某一个配置文件启动项目

    IntelliJ IDEA下SpringBoot如何指定某一个配置文件启动项目

    这篇文章主要介绍了IntelliJ IDEA下SpringBoot如何指定某一个配置文件启动项目问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09

最新评论