设计模式-创建型模式:抽象工厂

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 设计模式-创建型模式:抽象工厂

1、简介

抽象工厂(Abstract Factory)模式是一种创建型设计模式,它提供了一种方法创建相关或依赖对象的家族,而不需要明确指定它们的具体类。

在抽象工厂模式中,有一个抽象工厂类,它负责创建一组相关或依赖的对象。它包含多个用于创建不同对象的方法,每个方法都返回一个抽象产品类型的对象。

具体工厂类是抽象工厂的子类,它实现了在抽象工厂中声明的方法。每个具体工厂类可以创建多个具体产品类的实例。

抽象产品是一个接口或抽象类,它声明了由具体产品实现的方法。

具体产品是实现了抽象产品接口的具体类,每个具体产品类都定义了一组具体的方法。

2、适用情况

抽象工厂模式适用的情况包括:

①当系统中有多个产品族,每个产品族中又包含多个产品时。

例如,在一个汽车生产系统中,可能有多种品牌的汽车,每种品牌又有多种车型。在这种情况下,可以使用抽象工厂模式来创建不同品牌的汽车。

②当系统需要提供一组产品,而这些产品是相关的,或者属于同一类别时。

例如,在一个家庭生活系统中,可能需要提供一组家电产品,如冰箱、洗衣机、空调等。在这种情况下,可以使用抽象工厂模式来创建这些家电产品。

3、优缺点

优点:

抽象工厂模式提供了一种方法创建相关或依赖对象的家族。

它允许客户端使用抽象接口来创建产品,而不需要知道实际产品的类名。

抽象工厂模式可以使系统具有更好的灵活性,因为可以轻松地替换具体工厂。

缺点:

抽象工厂模式增加了系统的复杂度

因为客户端需要知道所有的具体工厂类才能使用它们。

如果系统中涉及的产品族较多,或者每个产品族中的产品较多,那么就需要定义很多的具体工厂类,这会增加系统的复杂度。

4、代码实现

1. interface AbstractFactory {
2. //抽象工厂
3.     AbstractProductA createProductA();
4.     AbstractProductB createProductB();
5. }
6. 
7. class ConcreteFactory1 implements AbstractFactory {
8. //具体工厂
9. @Override
10. public AbstractProductA createProductA() {
11. //具体产品
12. return new ConcreteProductA1();
13.     }
14. @Override
15. public AbstractProductB createProductB() {
16. return new ConcreteProductB1();
17.     }
18. }
19. 
20. class ConcreteFactory2 implements AbstractFactory {
21. @Override
22. public AbstractProductA createProductA() {
23. return new ConcreteProductA2();
24.     }
25. @Override
26. public AbstractProductB createProductB() {
27. return new ConcreteProductB2();
28.     }
29. }
30. 
31. interface AbstractProductA {
32. void methodA();
33. }
34. 
35. class ConcreteProductA1 implements AbstractProductA {
36. @Override
37. public void methodA() {
38. // 实现方法A
39.         System.out.println("A1");
40. 
41.     }
42. }
43. 
44. class ConcreteProductA2 implements AbstractProductA {
45. @Override
46. public void methodA() {
47. // 实现方法A
48.         System.out.println("A2");
49. 
50.     }
51. }
52. 
53. interface AbstractProductB {
54. void methodB();
55. }
56. 
57. class ConcreteProductB1 implements AbstractProductB {
58. @Override
59. public void methodB() {
60. // 实现方法B
61.         System.out.println("B1");
62. 
63.     }
64. }
65. 
66. class ConcreteProductB2 implements AbstractProductB {
67. @Override
68. public void methodB() {
69. // 实现方法B
70.         System.out.println("B2");
71. 
72.     }
73. }
74. 
75. public class test {
76. public static void main(String[] args) {
77. AbstractFactory factory = new ConcreteFactory1();
78. AbstractProductA productA = factory.createProductA();
79. AbstractProductB productB = factory.createProductB();
80.         productA.methodA();
81. 
82.     }
83. }

定义了抽象工厂和抽象产品两个接口,然后使用具体工厂实现具体产品,如图所示,在客户端代码中,通过抽象工厂得到具体工厂、具体工厂创造具体产品的方式来创建产品

总的来说,抽象工厂模式是一种有用的设计模式,它可以解决多个产品族的创建问题,但是在使用时应该根据系统的具体情况进行选择。

5、应用场景

常见的抽象工厂模式的应用场景是创建数据库访问对象

例如,我们有一个系统需要连接到不同的数据库(Oracle, MySQL, SQL Server等),并执行不同的SQL语句。我们可以使用抽象工厂模式来实现这个功能。

首先定义抽象工厂接口DBConnectionFactory,其中定义了创建数据库连接和命令的抽象方法:

1. interface DBConnectionFactory {
2.     DBConnection createDBConnection();
3.     DBCommand createDBCommand();
4. }

然后为不同数据库创建具体的工厂类,例如 OracleDBConnectionFactory, MySqlDBConnectionFactory, SqlServerDBConnectionFactory,实现对应数据库连接和命令

1. class OracleDBConnectionFactory implements DBConnectionFactory {
2. public DBConnection createDBConnection() {
3. return new OracleDBConnection();
4.     }
5. public DBCommand createDBCommand() {
6. return new OracleDBCommand();
7.     }
8. }
9. class MySqlDBConnectionFactory implements DBConnectionFactory {
10. public DBConnection createDBConnection() {
11. return new MySqlDBConnection();
12.     }
13. public DBCommand createDBCommand() {
14. return new MySqlDBCommand();
15.     }
16. }

最后,在系统中只需要在运行时指定使用哪个工厂来创建数据库访问对象即可

1. DBConnectionFactory factory = getDBConnectionFactory();
2. DBConnection conn = factory.createDBConnection();
3. DBCommand cmd = factory.createDBCommand();

这样,当需要在不同数据库上运行系统时,只需要在 getDBConnectionFactory() 中返回不同的工厂实例即可创建不同数据库的访问对象。 这样就不需要在系统中做大量的if else判断,可以在类层次中使用继承来实现可拓展性和可维护性。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9月前
|
设计模式
设计模式之抽象工厂
设计模式之抽象工厂
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
3月前
|
设计模式 架构师 Java
设计模式之 5 大创建型模式,万字长文深剖 ,近 30 张图解!
设计模式是写出优秀程序的保障,是让面向对象保持结构良好的秘诀,与架构能力与阅读源码的能力息息相关,本文深剖设计模式之 5 大创建型模式。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
设计模式之 5 大创建型模式,万字长文深剖 ,近 30 张图解!
|
5月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
6月前
|
设计模式 存储 负载均衡
【五】设计模式~~~创建型模式~~~单例模式(Java)
文章详细介绍了单例模式(Singleton Pattern),这是一种确保一个类只有一个实例,并提供全局访问点的设计模式。文中通过Windows任务管理器的例子阐述了单例模式的动机,解释了如何通过私有构造函数、静态私有成员变量和公有静态方法实现单例模式。接着,通过负载均衡器的案例展示了单例模式的应用,并讨论了单例模式的优点、缺点以及适用场景。最后,文章还探讨了饿汉式和懒汉式单例的实现方式及其比较。
【五】设计模式~~~创建型模式~~~单例模式(Java)
|
6月前
|
设计模式 XML 存储
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
文章详细介绍了抽象工厂模式,这是一种创建型设计模式,用于提供一个接口以创建一系列相关或相互依赖的对象,而不指定它们具体的类。通过代码示例和结构图,文章展示了抽象工厂模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了如何通过配置文件和反射机制实现工厂的动态创建。
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
|
6月前
|
设计模式 XML 存储
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
文章详细介绍了工厂方法模式(Factory Method Pattern),这是一种创建型设计模式,用于将对象的创建过程委托给多个工厂子类中的某一个,以实现对象创建的封装和扩展性。文章通过日志记录器的实例,展示了工厂方法模式的结构、角色、时序图、代码实现、优点、缺点以及适用环境,并探讨了如何通过配置文件和Java反射机制实现工厂的动态创建。
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
|
6月前
|
设计模式 XML Java
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
文章详细介绍了简单工厂模式(Simple Factory Pattern),这是一种创建型设计模式,用于根据输入参数的不同返回不同类的实例,而客户端不需要知道具体类名。文章通过图表类的实例,展示了简单工厂模式的结构、时序图、代码实现、优缺点以及适用环境,并提供了Java代码示例和扩展应用,如通过配置文件读取参数来实现对象的创建。
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
|
6月前
|
设计模式 存储 XML
[设计模式]创建型模式-抽象工厂模式
[设计模式]创建型模式-抽象工厂模式