Java设计模式之工厂方法模式详解

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

1.工厂方法是什么

众所周知,工厂是生产产品的,并且产品供消费者使用。消费者不必关心产品的生产过程,只需要关心用哪种产品就行。

在Java世界中,工厂方法模式和现实功能类似。工厂即一个工厂类,提供获得对象(产品)的方法(工厂方法)。其他类(消费者)需要用到某个对象时,只需调用工厂方法就行,不必new这个对象。

2.如何实现

1)创建产品的抽象类或接口---抽象产品

2)创建具体产品的类---具体产品

3)创建工厂的抽象类或接口---抽象构造类

4)创建具体工厂类---具体构造类

3.代码实现

     比如想要获得车的参数信息,轮胎信息等。

1)抽象产品

/**
 * 产品抽象类
 */
public abstract class Tyre {
    String name;
    public abstract void getName();
}

2)具体产品

/**
 * 具体产品
 */
public class MichelinTyre extends Tyre {
    MichelinTyre(){
        name = "米其林轮胎";
    }
    @Override
    public void getName() {
        System.out.println("car name :"+name);
    }
}

3)抽象构造类

/**
 * 抽象构造类
 */
public abstract class Car {
    /**
     * 对外提供产品的抽象方法
     * @return
     */
    public abstract Tyre getTyre();
}

4)具体构造类

/**
 * 具体构造类
 */
public class BydCar extends Car {
    /**
     * 对外提供获得对象的方法。
     * 当用户想要获得某个产品时,可以通过相应的工厂方法来获取,而不是直接通过new的方式。
     * 优点:避免用户通过new来获取对象,让用户代码和产品代码解耦。
     * @return
     */
    @Override
    public Tyre getTyre() {
        return new MichelinTyre();
    }
}

5)测试类

/**
 * 测试类
 */
public class Main {
    public static void main(String args []){
        Tyre tyre;
        Car car = new BydCar();
        tyre = car.getTyre();
        tyre.getName();
    }
}

4.工厂方法模式的优点

1)可以让用户代码和某个特定对象的子类的代码解耦

2)用户不必关心他所使用的对象是如何创建的,只需要知道该对象有哪些方法可供调用即可。

5.拓展

工厂模式在Java集合框架中的应用案例

        Collection<Integer> list = new LinkedList<Integer>();
        for(int i = 0;i<5;i++){
            list.add(i);
        }
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

在Collection接口中定义了一个 iterator方法,返回Iterator接口的实例。

   Iterator接口----抽象产品

   Iterator的实现类---具体产品

   Collection接口---抽象构造

  LinkedList链表类--具体构造类

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

相关文章

  • java执行SQL语句实现查询的通用方法详解

    java执行SQL语句实现查询的通用方法详解

    这篇文章主要介绍了java执行SQL语句实现查询的通用方法详解,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • 使用FeignClient设置动态Url

    使用FeignClient设置动态Url

    这篇文章主要介绍了使用FeignClient设置动态Url方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 关于Java Interface接口的简单练习题

    关于Java Interface接口的简单练习题

    这篇文章主要给大家分享的是关于Java Interface接口的简单练习题,难度不算大,但是要有一个清晰的逻辑建立接口和链接Java类。下面来看看文章的详细介绍吧,需要的朋友可以参考一下
    2021-11-11
  • HttpServletRequest对象方法的用法小结

    HttpServletRequest对象方法的用法小结

    HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的相关方法,即可以获得客户的这些信息
    2017-03-03
  • 深入理解Java嵌套类和内部类

    深入理解Java嵌套类和内部类

    本篇文章主要介绍了深入理解Java嵌套类和内部类,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java的字符串常量池StringTable详解

    Java的字符串常量池StringTable详解

    这篇文章主要介绍了Java的字符串常量池StringTable详解,JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化,为 了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,需要的朋友可以参考下
    2023-11-11
  • Mybatis自定义typeHandle过程解析

    Mybatis自定义typeHandle过程解析

    这篇文章主要介绍了Mybatis自定义typeHandle过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 使用@Valid 校验嵌套对象

    使用@Valid 校验嵌套对象

    这篇文章主要介绍了使用@Valid 校验嵌套对象方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 解决ThingsBoard编译报错问题:Failure to find org.gradle:gradle-tooling-api:jar:6.3

    解决ThingsBoard编译报错问题:Failure to find org.gradle:gradle-too

    这篇文章主要介绍了ThingsBoard编译报错:Failure to find org.gradle:gradle-tooling-api:jar:6.3,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 详解Java中的线程模型与线程调度

    详解Java中的线程模型与线程调度

    这篇文章主要介绍了详解Java中的线程模型与线程调度的相关资料,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2021-02-02

最新评论