工厂方法模式(FACTORYMETHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂、
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设计模式之工厂方法模式详解


基础教程推荐
- 使用堆栈算法进行括号/括号匹配 2022-01-01
- 如何对 Java Hashmap 中的值求和 2022-01-01
- 问题http://apache.org/xml/features/xinclude测试日志4j 2 2022-01-01
- 存储 20 位数字的数据类型 2022-01-01
- Struts2 URL 无法访问 2022-01-01
- Spring AOP错误无法懒惰地为此建议构建thisJoinPoin 2022-09-13
- RabbitMQ:消息保持“未确认"; 2022-01-01
- 无法复制:“比较方法违反了它的一般约定!" 2022-01-01
- REST Web 服务返回 415 - 不支持的媒体类型 2022-01-01
- 修改 void 函数的输入参数,然后读取 2022-01-01