关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

深入浅出设计模式 - 抽象工厂模式

发布时间:2023-06-27 14:00:36
博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家 Java知识图谱点击链接:体系化学习Java(Java面试专题) 感兴趣的同学可以收藏关注下 ,不然下次找不到哟 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喜欢的话记得点赞收藏啊

/template/Home/leiyu/PC/Static