Java设计模式之工厂方法模式详解
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工厂方法模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringCloud OpenFeign 参数传递和响应处理的详细步骤
本文给大家讲解SpringCloud OpenFeign 参数传递和响应处理的详细步骤,本文给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧2024-02-02解决java.util.HashMap$Values cannot be cast to java.ut的问题
这篇文章主要介绍了解决java.util.HashMap$Values cannot be cast to java.ut的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-03-03IDEA 使用mybatis插件Free Mybatis plugin的步骤(推荐)
这篇文章主要介绍了IDEA 使用mybatis插件Free Mybatis plugin的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-12-12SpringBoot+ThreadLocal+AbstractRoutingDataSource实现动态切换数据源
最近在做业务需求时,需要从不同的数据库中获取数据然后写入到当前数据库中,因此涉及到切换数据源问题,所以本文采用ThreadLocal+AbstractRoutingDataSource来模拟实现dynamic-datasource-spring-boot-starter中线程数据源切换,需要的朋友可以参考下2023-08-08
最新评论