博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌
Java知识图谱点击链接:体系化学习Java(Java面试专题)
💕💕 感兴趣的同学可以收藏关注下 ,不然下次找不到哟💕💕
文章目录
- 1、什么是抽象工厂模式
- 2、抽象工厂模式优缺点
- 3、抽象工厂模式的结构
- 4、抽象工厂模式的代码案例
- 4、抽象工厂模式的应用场景
1、什么是抽象工厂模式
抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。它是工厂方法模式的扩展,它通过组合多个工厂方法模式来实现一组对象的创建。
在抽象工厂模式中,有一个抽象工厂类负责定义创建一系列相关或相互依赖对象的接口,而具体的工厂类实现这个接口来创建具体的对象。每个具体的工厂类都负责创建一组对象,这些对象之间有一定的关联关系,可以满足一些特定的需求。
抽象工厂模式的优点是可以在不修改客户端代码的情况下,增加或修改一组对象的创建方式。同时,它能够保证一组对象的创建是相互依赖的,并且可以保证这些对象之间的兼容性。
抽象工厂模式的缺点是增加新的产品族比较困难,需要修改抽象工厂接口和所有的具体工厂类,同时也会增加系统的复杂度。
2、抽象工厂模式优缺点
抽象工厂模式的优点:
- 抽象工厂模式可以将一组相关的产品族统一到一起创建,使得客户端更加方便使用这些产品。
- 抽象工厂模式可以保证产品之间的兼容性,因为同一个工厂创建的产品都是相互配合使用的。
- 抽象工厂模式可以隔离具体类的生成,使得客户端不需要知道具体的类名,只需要知道工厂的名字即可。
抽象工厂模式的缺点:
- 抽象工厂模式的扩展性较差,新增一个产品族时需要修改抽象工厂接口和所有的具体工厂类。
- 抽象工厂模式的代码量较大,因为需要定义很多抽象类和接口。
- 抽象工厂模式只适用于产品族的创建,不适用于单个产品的创建。如果只需要创建单个产品,建议使用工厂方法模式。
3、抽象工厂模式的结构
抽象工厂模式的结构包括以下几个部分:
- 抽象工厂(Abstract Factory):定义了一个接口,用于创建一组相关或者相互依赖的对象。
- 具体工厂(Concrete Factory):实现了抽象工厂接口,用于创建一组具体的产品。
- 抽象产品(Abstract Product):定义了产品的接口,用于描述产品的属性和行为。
- 具体产品(Concrete Product):实现了抽象产品接口,具体产品是由具体工厂创建的。
抽象工厂模式的结构可以用以下 UML 类图表示:
| AbstractFactory | | AbstractProduct |
----------------- -----------------
| + createProductA()|<------| + operation() |
| + createProductB()| -----------------
----------------- ^
^ |
| |
----------------- -----------------
| ConcreteFactory | | ConcreteProduct |
----------------- -----------------
| + createProductA()|<------| + operation() |
| + createProductB()| -----------------
-----------------
在这个结构中,抽象工厂定义了创建一组相关产品的接口,具体工厂实现了抽象工厂接口,用于创建一组具体的产品。抽象产品定义了产品的接口,具体产品实现了抽象产品接口,是由具体工厂创建的。客户端通过抽象工厂和抽象产品来使用具体工厂和具体产品,从而实现了产品族的创建。
4、抽象工厂模式的代码案例
抽象产品类:
package com.pany.camp.design.principle.abs;
/**
*
* @description: 抽象产品类
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-27 12:08
*/
public interface Button {
void paint();
}
具体产品类:
package com.pany.camp.design.principle.abs;
/**
*
* @description: 具体产品类 - Windows
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-27 12:08
*/
public class WindowsButton implements Button {
@Override
public void paint() {
System.out.println("Windows Button");
}
}
package com.pany.camp.design.principle.abs;
/**
*
* @description: 具体产品类 - Mac
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-27 12:08
*/
public class MacButton implements Button {
@Override
public void paint() {
System.out.println("Mac Button");
}
}
抽象工厂类:
package com.pany.camp.design.principle.abs;
/**
*
* @description: 抽象工厂类
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-27 12:09
*/
public interface GUIFactory {
Button createButton();
}
具体工厂类:
package com.pany.camp.design.principle.abs;
/**
*
* @description: 具体工厂类 - WindowsFactory
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-27 12:09
*/
public class WindowsFactory implements GUIFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
}
package com.pany.camp.design.principle.abs;
/**
*
* @description: 具体工厂类 - MacFactory
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-27 12:10
*/
public class MacFactory implements GUIFactory {
@Override
public Button createButton() {
return new MacButton();
}
}
客户端代码:
package com.pany.camp.design.principle.abs;
/**
*
* @description: 客户端
* @copyright: @Copyright (c) 2022
* @company: Aiocloud
* @author: pany
* @version: 1.0.0
* @createTime: 2023-06-27 12:10
*/
public class Client {
private Button button;
public Client(GUIFactory factory) {
button = factory.createButton();
}
public void paint() {
button.paint();
}
public static void main(String[] args) {
Client windowsClient = new Client(new WindowsFactory());
Client macClient = new Client(new MacFactory());
windowsClient.paint();
macClient.paint();
}
}
输出如下:
Windows Button
Mac Button
Process finished with exit code 0
4、抽象工厂模式的应用场景
抽象工厂模式在 Java 中的应用场景包括:
- 当需要创建一组相关或相互依赖的对象时,使用抽象工厂模式可以将对象的创建过程封装起来,使得客户端不需要知道具体的实现细节。
- 当需要在不同的平台或环境下使用不同的实现时,使用抽象工厂模式可以使得客户端代码与具体实现解耦,从而更容易进行维护和扩展。
- 当需要支持多种不同类型的产品,且这些产品之间存在一定的关联关系时,使用抽象工厂模式可以将不同类型的产品的创建过程封装起来,使得客户端可以方便地使用这些产品。
- 当需要在运行时动态地更改产品的实现时,使用抽象工厂模式可以使得客户端代码与具体实现解耦,从而更容易进行动态配置和管理。
总之,抽象工厂模式适用于需要创建一组相关或相互依赖的对象,并且需要支持多种不同类型的产品,或者需要在不同的平台或环境下使用不同的实现的情况。
💕💕 本文由激流原创,首发于CSDN博客,博客主页 https://blog.csdn.net/qq_37967783?spm=1010.2135.3001.5421
💕💕喜欢的话记得点赞收藏啊