Abstract Factory(抽象工厂)-对象创建模式(附代码)

1.意图

提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类。

2.适用性

  • 一个系统要独立于它的产品创建、组合和表示时。
  • 一个系统要由多个产品系列中的一个来配置时。
  • 当你强调一系列相关的产品对象的设计以便进行联合使用时。
  • 当你提供一个产品的类库,而只想显示它们的接口而不是实现时。

3.结构图

如上图所示为抽象工厂的结构图,每一个工厂负责创建一系列产品。

4.C++代码实例

#include <cstdlib>
#include <string>
class AbstractFactory;

class Client
{
public:
    Client(){};
    ~Client(){};
    AbstractFactory *GetFactory(std::string type);
private:
    AbstractFactory *pFactory;

};

Client.h

 1 class AbstractProductA
 2 {
 3 public:
 4     AbstractProductA()
 5     {
 6     }
 7     virtual ~AbstractProductA()
 8     {
 9     };
10 };
11
12
13 class AbstractProductB
14 {
15 public:
16     AbstractProductB()
17     {
18     }
19     virtual ~AbstractProductB()
20     {
21     };
22 };

AbstractProduct

 1 class AbstractProductA;
 2 class AbstractProductB;
 3
 4 class AbstractFactory
 5 {
 6 public:
 7      AbstractFactory()
 8      {
 9      };
10      ~AbstractFactory(){};
11     virtual AbstractProductA * CreateProductA()=0;
12     virtual AbstractProductB * CreateProductB()=0;
13 };

AbstractFactory

 1 #include "AbstractFactory.h"
 2
 3 class AbstractProductA;
 4 class AbstractProductB;
 5
 6 class ConcreteFactory1 : public AbstractFactory
 7 {
 8 public:
 9     ConcreteFactory1();
10     ~ConcreteFactory1();
11     AbstractProductA * CreateProductA();
12     AbstractProductB * CreateProductB();
13 };
14
15 class ConcreteFactory2 : public AbstractFactory
16 {
17 public:
18     ConcreteFactory2();
19     ~ConcreteFactory2();
20     AbstractProductA * CreateProductA();
21     AbstractProductB * CreateProductB();
22 };

ConcreteFactory

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <iostream>
 4 #include "AbstractProduct.h"
 5
 6 class ConcreteProductA1 : public AbstractProductA
 7 {
 8 public:
 9     ConcreteProductA1()
10     {
11         std::cout << "ConcreteProductA1 is Created" << std::endl;
12     }
13     ~ConcreteProductA1()
14     {
15     }
16 };
17
18 class ConcreteProductA2 : public AbstractProductA
19 {
20 public:
21     ConcreteProductA2()
22     {
23         std::cout << "ConcreteProductA2 is Created" << std::endl;
24     }
25     ~ConcreteProductA2()
26     {
27     }
28 };
29
30 class ConcreteProductB1 : public AbstractProductB
31 {
32 public:
33     ConcreteProductB1()
34     {
35         std::cout << "ConcreteProductB1 is Created" << std::endl;
36     }
37
38     ~ConcreteProductB1()
39     {
40     }
41
42 };
43
44 class ConcreteProductB2 : public AbstractProductB
45 {
46 public:
47     ConcreteProductB2()
48     {
49         std::cout << "ConcreteProductB2 is Created" << std::endl;
50     }
51
52     ~ConcreteProductB2()
53     {
54     }
55 };

ConcereteProduct

#include "ConcreteFactory.h"
#include "ConcreteProduct.h"

ConcreteFactory1::ConcreteFactory1()
{
}

ConcreteFactory1::~ConcreteFactory1()
{
}

AbstractProductA * ConcreteFactory1::CreateProductA()
{
    auto product = new ConcreteProductA1();
    return product;
}

AbstractProductB * ConcreteFactory1::CreateProductB()
{
    auto product = new ConcreteProductB1();
    return product;
}

ConcreteFactory2::ConcreteFactory2()
{
}

ConcreteFactory2::~ConcreteFactory2()
{
}

AbstractProductA * ConcreteFactory2::CreateProductA()
{
    auto product = new ConcreteProductA2();
    return product;
}

AbstractProductB * ConcreteFactory2::CreateProductB()
{
    auto product = new ConcreteProductB2();
    return product;
}

ConcreteFactory.cpp

#include "Client.h"
#include "ConcreteFactory.h"

 AbstractFactory *Client::GetFactory(std::string type)
 {
     if("1" == type)
     {
         auto pFactory = new ConcreteFactory1();
         return pFactory;
     }
     else if ("2" == type)
     {
         auto pFactory = new ConcreteFactory2();
         return pFactory;
     }
 }

Client.cpp

#include "Client.h"
#include "AbstractFactory.h"
#include "AbstractProduct.h"

int main()
{
    auto client = new Client();
    auto pFactory = client->GetFactory("1");
    auto pProductA = pFactory->CreateProductA();
    auto pProductB = pFactory->CreateProductB();
    delete pProductB;
    pProductB = NULL;
    delete pProductA;
    pProductA = NULL;
    delete pFactory;
    pFactory = NULL;

    pFactory = client->GetFactory("2");
    pProductA = pFactory->CreateProductA();
    pProductB = pFactory->CreateProductB();
    delete pProductB;
    pProductB = NULL;
    delete pProductA;
    pProductA = NULL;
    delete pFactory;
    pFactory = NULL;
    delete client;
    client=NULL;

    while(1);

}

TestCode.cpp

测试结果:

如测试代码中所写,先创建1系列的产品A和B,后创建2系列的产品A和B。

5.效果

  • 分离了具体的类,产品的类名不出现在测试代码(即客户代码)中。
  • 使得易于交换产品系列。
  • 利于产品的一致性。
  • 难以支持新种类的产品

6.相关模式

抽象工厂类通常用工厂方法实现,但是也可以用原型实现。一个具体的工厂通常是一个单件。

时间: 2024-10-31 17:43:53

Abstract Factory(抽象工厂)-对象创建模式(附代码)的相关文章

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

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

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

5.2 抽象工厂模式 动机:在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 代码示例: 实现利用数据库的业务逻辑,支持多数据库(Sql,Oracle等),有连接.命令.读取等功能. 其中命令,连接功能之间有相互联系. 方法一(使用工厂方法): 每个功能类有一个创建的工厂,如IDBConnection与IDBConnectionFactory 1 //数据库访问有关的基类 2 class IDBConnection{ 3

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

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

Abstract Factory 抽象工厂模式

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

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

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

深入浅出设计模式 ------ Abstract Factory(抽象工厂)

一. 定义  提供一个创建一系列相关或相互依赖对象的接口, 而无需指定它们的具体类. 二. 结构 三. 参与者 Product (Fruit和Leaf两个抽象产物) : 抽象生产者接口: TreeFruit(树上的水果). TreeLeaf(树上的叶子). GroundFruit(地上的水果). GroundLeaf(地上的叶子) : 实际的自然产物: NatureFactory: 抽象的自然制造工厂, 用于生产水果和叶子: TreeFactory. LeafFactory : 实际的自然制造工

设计模式之:对象创建模式

通过 对象创建 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型的模式: Factory Method 工厂方法模式 Abstract Factory 抽象工厂模式 Prototype  原型模式 Builder 构建器 一,.Factory Method 1,出现原因 在软件系统中,经常面临创建对象的工作.由于需求的变化,需要创建的对象的具体类型经常变化. 如何解决? 绕过常规的对象创建方法(new),提供

C++设计模式 之 “对象创建”模式:Factory Method

part 0 “对象创建”模式 通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式 Factory Method Abstract Factory Prototype Builder Part 1 Factory Method 工厂方法 动机(Motivation) 在软件系统中,经常面临着创建对象的工作:由于需求的变化,需要创建的对象的具体类型经常变化. 如何应对这种变化?如何绕过常规的

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

结合简单示例和UML图,讲解工厂模式简单原理. 一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!",坐上Bmw后他说"开宝马车!",坐上 Audi后他说"开奥迪车!".你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!幸运的是这种有

跟着实例学习设计模式(4)-抽象工厂(创建型)

抽象工厂属于创建型设计模式 设计意图:提供一个接口.能够创建一系列相关或相互依赖的对象,而无须指定它们详细的类. 光看设计意图有些抽象,不好理解.让我们来看一下实例类图,结合类图我们再做详细的解释,相信会让大家豁然开朗的.我们以生产汽车为例,我们生产的汽车分两个系列,小车.卡车,每一个系列汽车都有发动机和油箱. 上图: IAbstrcatFactory:抽象工厂接口,声明创建抽象产品的方法. CarFactory:小车工厂实现类. TrunkFactory:卡车工厂实现类. 这里我们为每一个系列