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

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

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判断,可以在类层次中使用继承来实现可拓展性和可维护性。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
384 16
|
设计模式 缓存 安全
【设计模式】【创建型模式】单例模式(Singleton)
一、入门 什么是单例模式? 单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。它常用于需要全局唯一对象的场景,如配置管理、连接池等。 为什么要单例模式? 节省资源 场景:某些对象创
475 15
|
设计模式 JavaScript Java
【设计模式】【创建型模式】原型模式(Prototype)
一、入门 什么是原型模式? 原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有对象来创建新对象,而不是通过实例化类。 原型模式的核心是克隆(Clone),即通过复制现有
324 15
|
设计模式 Java Apache
【设计模式】【创建型模式】建造者模式(Builder)
一、入门 什么是建造者模式? 建造者模式(Builder Pattern)是一种创建型设计模式,用于逐步构建复杂对象。 它通过将对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。 为什么
835 14
|
设计模式 Java 关系型数据库
【设计模式】【创建型模式】抽象工厂模式(Abstract Factory)
一、入门 什么是抽象工厂模式? 抽象工厂模式是一种创建型设计模式,它提供了一个接口,用于创建相关或依赖对象的家族,而不需要指定具体的类。 简单来说,抽象工厂模式是工厂方法模式的升级版,它能够创建一组相
449 14
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
927 140
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
设计模式 XML Java
设计模式觉醒系列(03)创建型模式的5个设计模式 | 一口气讲全讲透
本文详细介绍了设计模式中的创建型模式,包括建造者模式、原型模式、单例模式、工厂方法模式和抽象工厂模式。创建型模式关注对象的创建过程,隐藏了创建细节,以提高代码的可维护性和可扩展性。通过具体的实战demo和应用场景分析,展示了每种模式的特点和优势。例如,建造者模式适用于复杂对象的分步骤构建;原型模式通过复制对象实现高效复用;单例模式确保全局唯一实例;工厂方法模式和抽象工厂模式则提供了灵活的对象创建机制,支持多类型产品族的生产。这些模式在实际开发中能够简化客户端代码,提升系统灵活性和复用性。
|
设计模式 架构师 Java
设计模式之 5 大创建型模式,万字长文深剖 ,近 30 张图解!
设计模式是写出优秀程序的保障,是让面向对象保持结构良好的秘诀,与架构能力与阅读源码的能力息息相关,本文深剖设计模式之 5 大创建型模式。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
设计模式之 5 大创建型模式,万字长文深剖 ,近 30 张图解!
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
1400 2
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)

热门文章

最新文章