创建型设计模式 - 抽象工厂模式 - JAVA
抽象工厂设计模式
前言
这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱
抽象工厂设计模式是创建模式之一。抽象工厂模式 几乎与 工厂模式 相似,只是它更像工厂的工厂。
一. 简介
看本片文章前,可以先看 ,您会注意到我们有一个 Factory 类。该工厂类根据提供的输入返回不同的子类,工厂类使用 if-else 或 switch 语句来实现此目的。在抽象工厂模式中,我们摆脱了 if-else 块,并为每个子类都有一个工厂类。然后是一个抽象工厂类,它将根据输入工厂类返回子类。并且工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。大白话可能没办法讲清楚,接下来会通过代码解释,这样就能很容易掌握和理解工厂模式和抽象工厂模式之间的细微差别。
二. 列子
就像我们的工厂模式案例一样,我们将使用相同的超类和子类。
假如我们要做一个电脑购买系统,里面有台式机 和笔记本 ,他们是 电脑(Computer)类别,在购买的时候可以选择内存(memory)和磁盘(disk)两个参数。可是台式机又有 华为台式机 (HuaWeiPc)和 小米台式机(XiaoMiPc) , 笔记本又有 华为笔记本(HuaWeiLaptop) 和小米笔记本(XiaoMiLaptop) 。 台式机和笔记本是一个等级,华为和小米又是一个等级,这种多态性就适合使用抽象工厂设计模式,类图如下:
这里设置一个抽象工厂(ComputerAbstractFactory), 台式机 (PcFactory),笔记本(LaptopFactory)这两个工厂实现他,创建一个工厂(ComputerFactory)给客户端提供创建子类的入口点
2.1 定义电脑的抽象类和子类
电脑抽象类
/**
* 电脑抽象类
*
* @author chenyunzhi
* @date 2023/12/27 0:09
*/
public abstract class Computer {
/**
* 内存抽象方法
* @return string
*/
public abstract String memory();
/**
* 磁盘抽象方法
* @return string
*/
public abstract String disk();
@Override
public String toString() {
return "内存:" + memory() + " " + "磁盘:" + disk();
}
}
华为台式机
/**
* 华为台式机
*
* @author chenyunzhi
* @date 2023/12/27 0:22
*/
public class HuaWeiPc extends Computer {
private final String memory;
private final String disk;
public HuaWeiPc(String memory, String disk) {
this.memory = memory;
this.disk = disk;
}
@Override
public String memory() {
return this.memory;
}
@Override
public String disk() {
return this.disk;
}
}
小米台式机
/**
* 小米台式机
*
* @author chenyunzhi
* @date 2023/12/27 0:23
*/
public class XiaoMiPc extends Computer{
private final String memory;
private final String disk;
public XiaoMiPc(String memory, String disk) {
this.memory = memory;
this.disk = disk;
}
@Override
public String memory() {
return this.memory;
}
@Override
public String disk() {
return this.disk;
}
}
华为笔记本
/**
* 华为笔记本
*
* @author chenyunzhi
* @date 2023/12/27 0:26
*/
public class HuaWeiLaptop extends Computer{
private final String memory;
private final String disk;
public HuaWeiLaptop(String memory, String disk) {
this.memory = memory;
this.disk = disk;
}
@Override
public String memory() {
return this.memory;
}
@Override
public String disk() {
return this.disk;
}
}
小米笔记本
/**
* 小米笔记本
*
* @author chenyunzhi
* @date 2023/12/27 0:30
*/
public class XiaoMiLaptop extends Computer{
private final String memory;
private final String disk;
public XiaoMiLaptop(String memory, String disk) {
this.memory = memory;
this.disk = disk;
}
@Override
public String memory() {
return this.memory;
}
@Override
public String disk() {
return this.disk;
}
}
2.2 定义抽象工厂类和其实现类
电脑抽象工厂
创建一个接口或者抽象类都可以
/**
* 电脑抽象工厂
*
* @author chenyunzhi
* @date 2023/12/27 22:53
*/
public interface ComputerAbstractFactory {
/**
* 创建华为电脑接口
*/
public Computer createHuaWeiComputer();
/**
* 创建小米电脑接口
*/
public Computer createXiaoMiComputer();
}
台式机工厂
/**
* 台式机工厂
*
* @author chenyunzhi
* @date 2023/12/27 21:57
*/
public class PcFactory implements ComputerAbstractFactory{
private final String memory;
private final String disk;
public PcFactory(String memory, String disk) {
this.memory = memory;
this.disk = disk;
}
@Override
public Computer createHuaWeiComputer() {
return new HuaWeiPc(memory, disk);
}
@Override
public Computer createXiaoMiComputer() {
return new XiaoMiPc(memory, disk);
}
}
笔记本工厂
/**
* 笔记本工厂
*
* @author chenyunzhi
* @date 2023/12/27 23:08
*/
public class LaptopFactory implements ComputerAbstractFactory{
private final String memory;
private final String disk;
public LaptopFactory(String memory, String disk) {
this.memory = memory;
this.disk = disk;
}
@Override
public Computer createHuaWeiComputer() {
return new HuaWeiLaptop(memory, disk);
}
@Override
public Computer createXiaoMiComputer() {
return new XiaoMiLaptop(memory, disk);
}
}
2.3 测试
/**
* 测试
*
* @author chenyunzhi
* @date 2023/12/27 23:25
*/
public class TestDesignPatterns {
public static void main(String[] args) {
testDesignPatterns();
}
private static void testDesignPatterns() {
Computer huaWeiComputer = ComputerFactory.getHuaWeiComputer(new PcFactory("32 GB", "1 TB"));
System.out.println("华为pc电脑 = " + huaWeiComputer);
Computer xiaoMiComputer = ComputerFactory.getXiaoMiComputer(new PcFactory("16 GB", "512 GB"));
System.out.println("小米pc电脑 = " + xiaoMiComputer);
Computer huaWeiComputer1 = ComputerFactory.getHuaWeiComputer(new LaptopFactory("8 GB", "1 TB"));
System.out.println("华为笔记本电脑 = " + huaWeiComputer1);
Computer xiaoMiComputer1 = ComputerFactory.getXiaoMiComputer(new LaptopFactory("4 GB", "512 GB"));
System.out.println("小米笔记本电脑 = " + xiaoMiComputer1);
}
}
三. 抽象工厂设计模式的好处
-
抽象工厂模式是“工厂的工厂”,可以很容易地扩展以容纳更多的产品,例如我们可以添加另一个子类 ipad 和工厂 ipadFactory。
-
抽象工厂模式是健壮的,并且避免了工厂模式的条件逻辑。
四. 抽象工厂模式的案例
-
javax.xml.parsers.DocumentBuilderFactory#newInstance()
-
javax.xml.transform.TransformerFactory#newInstance()
-
javax.xml.xpath.XPathFactory#newInstance()
作者:神的孩子都在歌唱
本人博客:https://blog.csdn.net/weixin_46654114
- 点赞
- 收藏
- 关注作者
评论(0)