【java设计模式系列】3. 抽象工厂模式(Abstract Factory)
时间:2022-07-25
本文章向大家介绍【java设计模式系列】3. 抽象工厂模式(Abstract Factory),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
假设现在有一个车辆制造工厂,它生产两种车,A类车和B类车,每类车有其各自的车门和轮子,这就需要不同的车间来做,A类车的车间有生产车门的工作,有生产轮子的工作,B类车的车间有生产车门的工作,有生产轮子的工作,我们需要哪类车的部件时,就去哪个车间拿,拿的过程(相同的操作,抽取出来一个抽象工厂类,这里的拿就是指方法)是一样的。
下面用代码具体实现:
代码清单1:生产门(抽象产品)
public interface Door {
void createDoor();
}
代码清单2:生产A门(具体产品)
public class DoorA implements Door {
@Override
public void createDoor() {
System.out.println("create door A.");
}
}
代码清单3:生产B门(具体产品)
public class DoorB implements Door{
@Override
public void createDoor() {
System.out.println("create door B.");
}
}
代码清单4:生产轮子(抽象产品)
public interface Wheel {
void createWheel();
}
代码清单5:生产A轮子(具体产品)
public class WheelA implements Wheel {
@Override
public void createWheel() {
System.out.println("create wheel A.");
}
}
代码清单6:生产B轮子(具体产品)
public class WheelB implements Wheel {
@Override
public void createWheel() {
System.out.println("create wheel B.");
}
}
代码清单7:抽象工厂
public abstract class AbstractFactory {
public abstract void createDoor();
public abstract void createWheel();
}
代码清单8:具体A工厂
public class FactoryA extends AbstractFactory {
@Override
public void createDoor() {
new DoorA().createDoor();
}
@Override
public void createWheel() {
new WheelA().createWheel();
}
}
代码清单9:具体B工厂
public class FactoryB extends AbstractFactory {
@Override
public void createDoor() {
new DoorB().createDoor();
}
@Override
public void createWheel() {
new WheelB().createWheel();
}
}
代码清单10:测试类
public class Test {
public static void main(String[] args) {
new FactoryA().createDoor();
new FactoryA().createWheel();
new FactoryB().createDoor();
new FactoryB().createWheel();
}
}
输出结果:
create door A.
create wheel A.
create door B.
create wheel B.
总结:
抽象工厂模式相对于工厂方法模式来说,每个具体工厂可以生产一族产品(即多种产品);而工厂方法模式是具体工厂生产相应的具体产品,只能生产一种产品。当产品族中只有一种产品时抽象工厂模式退化成工厂方法模式。
附抽象工厂类图:
原文地址:http://men4661273.iteye.com/blog/1637880
- 【Java学习笔记之二十八】深入了解Java8新特性
- 【Java学习笔记之二十四】对Java多态性的一点理解
- 【Java学习笔记之二十六】深入理解Java匿名内部类
- 【Java学习笔记之二十五】初步认知Java内部类
- AIM Tech Round 4 (Div. 2)(A,暴力,B,组合数,C,STL+排序)
- 【Java学习笔记之三十】详解Java单例(Singleton)模式
- 基于Windows下处理Java错误:编码GBK的不可映射字符的解决方案
- 浅析ASCII、Unicode和UTF-8三种常见字符编码
- 【Java学习笔记之三十一】详解Java8 lambda表达式
- 2017 Multi-University Training Contest - Team 9 1003&&HDU 6163 CSGO【计算几何】
- 【Code】关关的刷题日记21——Leetcode 485. Max Consecutive Ones
- 2017 Multi-University Training Contest - Team 9 1002&&HDU 6162 Ch’s gift【树链部分+线段树】
- 【Java学习笔记之三十二】浅谈Java中throw与throws的用法及异常抛出处理机制剖析
- Linux上访问SQL Server数据库
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Linux which命令的具体使用
- Linux安装Python3.8.1的教程详解
- linux压缩文件命令zip的实例用法
- centos下samba文件夹共享服务器配置详解
- Centos7安装FFmpeg音/视频工具简易文档
- Linux 进程通信之FIFO的实现
- Linux nl命令的使用方法
- Linux gcc命令的具体使用
- Linux dirname命令的具体使用
- Linux 相对路径和绝对路径的使用
- Linux basename命令的使用方法
- 在Ubuntu上搭建一个基于webrtc的多人视频聊天服务实例代码详解
- linux中权限管理命令详解(chmod/chown/chgrp/unmask)
- linux下用time(NULL)函数和localtime()获取当前时间的方法
- linux防火墙状态查看的方法实例