c++ 设计模式9 (Abstract Factory 抽象工厂模式)

5.2 抽象工厂模式

动机:在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。

代码示例:

实现利用数据库的业务逻辑,支持多数据库(Sql,Oracle等),有连接、命令、读取等功能。

其中命令,连接功能之间有相互联系。

方法一(使用工厂方法):

每个功能类有一个创建的工厂,如IDBConnection与IDBConnectionFactory

 1 //数据库访问有关的基类
 2 class IDBConnection{
 3
 4 };
 5 class IDBConnectionFactory{
 6 public:
 7     virtual IDBConnection* CreateDBConnection()=0;
 8 };
 9
10
11 class IDBCommand{
12
13 };
14 class IDBCommandFactory{
15 public:
16     virtual IDBCommand* CreateDBCommand()=0;
17 };
18
19
20 class IDataReader{
21
22 };
23 class IDataReaderFactory{
24 public:
25     virtual IDataReader* CreateDataReader()=0;
26 };
27
28
29 //支持SQL Server
30 class SqlConnection: public IDBConnection{
31
32 };
33 class SqlConnectionFactory:public IDBConnectionFactory{
34
35 };
36
37
38 class SqlCommand: public IDBCommand{
39
40 };
41 class SqlCommandFactory:public IDBCommandFactory{
42
43 };
44
45
46 class SqlDataReader: public IDataReader{
47
48 };
49 class SqlDataReaderFactory:public IDataReaderFactory{
50
51 };
52
53 //支持Oracle
54 class OracleConnection: public IDBConnection{
55
56 };
57
58 class OracleCommand: public IDBCommand{
59
60 };
61
62 class OracleDataReader: public IDataReader{
63
64 };
65
66
67
68 class EmployeeDAO{
69     IDBConnectionFactory* dbConnectionFactory;
70     IDBCommandFactory* dbCommandFactory;
71     IDataReaderFactory* dataReaderFactory;
72
73
74 public:
75     vector<EmployeeDO> GetEmployees(){
76         IDBConnection* connection =
77             dbConnectionFactory->CreateDBConnection(...);
78         connection->ConnectionString("...");
79
80         IDBCommand* command =
81             dbCommandFactory->CreateDBCommand(...);
82         command->CommandText("...");
83         command->SetConnection(connection); //关联性
84
85         IDBDataReader* reader = command->ExecuteReader(); //关联性
86         while (reader->Read()){
87
88         }
89
90     }
91 };

分析上述代码,虽然解决了组件创建的问题。但是仔细考虑,由于功能之间具有关联性,不同类型数据库的对象并不能同时创建搭配(如sql的command和oracle的connection搭配,显然不合理)。所以考虑抽象工厂模式。见方法二:

使用一个工厂,将一系列相互依赖的的对象创建在一个工厂中实现。

 1 //数据库访问有关的基类
 2 class IDBConnection{
 3
 4 };
 5
 6 class IDBCommand{
 7
 8 };
 9
10 class IDataReader{
11
12 };
13
14
15 class IDBFactory{
16 public:
17     virtual IDBConnection* CreateDBConnection()=0;
18     virtual IDBCommand* CreateDBCommand()=0;
19     virtual IDataReader* CreateDataReader()=0;
20
21 };
22
23
24 //支持SQL Server
25 class SqlConnection: public IDBConnection{
26
27 };
28 class SqlCommand: public IDBCommand{
29
30 };
31 class SqlDataReader: public IDataReader{
32
33 };
34
35
36 class SqlDBFactory:public IDBFactory{
37 public:
38     virtual IDBConnection* CreateDBConnection()=0;
39     virtual IDBCommand* CreateDBCommand()=0;
40     virtual IDataReader* CreateDataReader()=0;
41
42 };
43
44 //支持Oracle
45 class OracleConnection: public IDBConnection{
46
47 };
48
49 class OracleCommand: public IDBCommand{
50
51 };
52
53 class OracleDataReader: public IDataReader{
54
55 };
56
57
58
59 class EmployeeDAO{
60     IDBFactory* dbFactory;
61
62 public:
63     vector<EmployeeDO> GetEmployees(){
64         IDBConnection* connection =
65             dbFactory->CreateDBConnection();
66         connection->ConnectionString("...");
67
68         IDBCommand* command =
69             dbFactory->CreateDBCommand();
70         command->CommandText("...");
71         command->SetConnection(connection); //关联性
72
73         IDBDataReader* reader = command->ExecuteReader(); //关联性
74         while (reader->Read()){
75
76         }
77
78     }
79 };

模式定义:

提供一个接口,让该接口复杂创建一系列”相关或者相互依赖的对象“,无需指定它们具体的类。

类图:

要点总结:

如果没有应对”多系列对象构建“的需求变化,则没有必要使用Abstract Factory模式,这是要使用工厂方法即可。

”系列对象“指的是某一特定系列下的对象之间有相互依赖或作用的关系。不同系列的对象之间不能相互依赖。

Abstract Factory模式主要在于应对”新系列“的需求变动。其缺点在于难以应对”新对象“的需求变动。

时间: 2024-08-02 15:13:45

c++ 设计模式9 (Abstract Factory 抽象工厂模式)的相关文章

Java设计模式:Abstract Factory(抽象工厂)模式

概念定义 抽象工厂(Abstract Factory)模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂模式中,系统的产品有多于一个的产品族(一个产品族里定义多个产品),而系统只消费其中某一族的产品.换句话说,抽象工厂创建一整套具有相互依赖或作用关系的产品(至少两个产品),而工厂方法中的工厂只能创建单一系列的产品. 应用场景 客户端不需要知道它所创建的对象的类. 需要一组对象共同完成某种功能时,并且可能存在多组对象完成不同功能的情况. 系统结构稳定,不会频繁地增加

设计模式(一): abstract factory抽象工厂模式 -- 创建型模式

1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要强调一系列相关的产品对象的设计以便进行联合使用. 4.当你提供一个产品类库,而只想显示它们的接口而不是实现. 3.评价 1.它分离了具体的类 2.它使得易于交换产品系列 3.它有利于产品的一致性 4.难以支持新种类的产品 5."开放-封闭"原则要求系统对扩展开放,对修改封闭.通过扩展达到增

一天一个设计模式——Abstract Factory抽象工厂模式

一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂方法模式中,抽象工厂使用抽象的零件组装成抽象的产品.即使用包含特定的方法接口零件,将零件组装成抽象产品. 二.模式类图: 上面的类图中包含两个包:包含抽象工厂,抽象零件,抽象产品的类所在的包以及具体工厂实现类的包. 三.代码示例 1.Item类: package com.designpattern.

Abstract Factory 抽象工厂模式

提供一个创建一些列相关或相互依赖对象的接口,而无需指定它们具体的类. 抽象工厂顾名思义就是对工厂的抽象,它提供了一组创建抽象产品对象的操作接口,我们实际使用的是抽象工厂的派生类,派生类中提供了操作的具体实现,创建一组具体的对象. 以下情况可以使用抽象工厂模式: 一个系统要独立于它的产品的创建.组合和表示时. 一个系统要由多个产品系列中的一个来配置时. 当你要强调一系列相关的产品对象的设计以便进行联合使用时. 当你提供一个产品类库,而只想显示它们的接口而不是实现时. 抽象工厂模式的优缺点: 他分离

设计模式(3)--抽象工厂模式(Absrtact Factory Pattern)

定义 抽象工厂模式的实质就是提供接口来创建一系列相关或独立的对象而不指定这些对象的具体类. 理解 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作.如何应对这种变化?如何绕过常规的对象的创建方法(熟悉的new操作符),提供一种"封装机制"来避免客户程序和这种"多系列具体对象创建工作"的紧耦合?这就是我们要说的抽象工厂模式.抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂

设计模式(三)——抽象工厂模式

设计模式(三)--抽象工厂模式 一.抽象工厂模式 1.抽象工厂模式简介 定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. UML类图: 2.抽象工厂模式角色 (1)抽象工厂AbstractFactory:抽象工厂类,提供创建两种产品的接口CreateProductA和CreateProductB,由派生的各个具体工厂类对其实现 (2)具体工厂:包括具体工厂FactoryM和具体工厂FactoryN.具体工厂FactoryM用于生产具体产品MProductA和具体产品M

设计模式(3)抽象工厂模式(Abstract Factory)

设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 源码地址 0 抽象工厂模式简介 0.0 抽象工厂模式定义 抽象工厂模式一般的书面定义为:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类 提供创建接口,无需指定具体实现类,这个原则在简单工厂模式和工厂方法模式篇已经反复讲到了,这是面向接口编程的一个基本准则,很显然,从抽象工厂模式的一般定义中可以看出这也是抽象工厂模式的一个核心,而抽象工厂模式的另

PHP设计模式(三)抽象工厂模式(Abstract Factory For PHP)

一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同属于同一个产品族的产品可以使用. 产品族:位于不同产品等级结构中,功能相关联的产品组成的家族.下面例子的 汽车和空调就是两个产品树, 奔驰C200+格力某型号空调就是一个产品族, 同理, 奥迪A4+海尔某型号空调也是一个产品族. 二.类图 三.抽象工厂模式的组成 抽象工厂(AbstractFacto

设计模式之十一:抽象工厂模式(Abstract Factory)

抽象工厂模式: 提供了一个创建一系列相关的或相互依赖的对象的接口而不需要具体指定它们的类型. Provide an interface for creating families of related or dependent objects without specifying their concrete classes. UML类图: 主要包括: AbstractFactory(ContinentFactory):抽象的工厂类,为具体的工厂类声明了一系列的接口. ConcreteFacto