【C++设计模式】抽象工厂模式

简介: 抽象工厂模式,其抽象程度更高,每一个具体工厂可以生产一组相关的具体产品对象。抽象工厂模式的定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

一、抽象工厂模式

抽象工厂模式,其抽象程度更高,每一个具体工厂可以生产一组相关的具体产品对象。

抽象工厂模式的定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。


1.1 抽象工厂模式结构

抽象工厂模式结构与工厂方法模式结构类似,不同之处在于,一个具体工厂可以生产多种同类相关的产品:


抽象工厂(AbstractFactory):所有生产具体产品的工厂类的基类,提供工厂类的公共方法;

具体工厂(ConcreteFactory):生产具体的产品

抽象产品(AbstractProduct):所有产品的基类,提供产品类的公共方法

具体产品(ConcreteProduct):具体的产品类

image.png

结合抽象工厂模式定义和UML,可以看到具体工厂ConcreteFactory_A可以生产两种产品,分别是ConcreteProduct_A_1和ConcreteProduct_A_2,另一个具体工厂ConcreteFactory_B同理。客户端使用时,需要声明一个抽象工厂AbstractFactory和两个抽象产品AbstractProduct。


1.2 抽象工厂模式的栗子

篮球保管室可以提供篮球和篮球衣,足球保管室可以提供足球和足球衣。Jungle只要根据心情去某个保管室,就可以换上球衣、拿上球,然后就可以愉快地玩耍了。

image.png

对应的UML实例图:


image.png

二、AbstractFactory.h头文件

//抽象工厂类
class AbstractFactory
{
public:
  virtual AbstractBall *getBall() = 0;
  virtual AbstractShirt *getShirt() = 0;
};

注意上面的抽象工厂类中定义两个纯虚函数。

//抽象产品类AbstractBall
class AbstractBall
{
public:
  AbstractBall(){}
  //抽象方法:
  void play(){};
};
//具体产品类Basketball
class Basketball :public AbstractBall
{
public:
  Basketball(){
    play();
  }
  //具体实现方法
  void play(){
    printf("Jungle play Basketball\n\n");
  }
};
//具体产品类Football
class Football :public AbstractBall
{
public:
  Football(){
    play();
  }
  //具体实现方法
  void play(){
    printf("Jungle play Football\n\n");
  }
};
//抽象产品类AbstractShirt
class AbstractShirt
{
public:
  AbstractShirt(){}
  //抽象方法:
  void wearShirt(){};
};
//具体产品类BasketballShirt
class BasketballShirt :public AbstractShirt
{
public:
  BasketballShirt(){
    wearShirt();
  }
  //具体实现方法
  void wearShirt(){
    printf("Jungle wear Basketball Shirt\n\n");
  }
};
//具体产品类FootballShirt
class FootballShirt :public AbstractShirt
{
public:
  FootballShirt(){
    wearShirt();
  }
  //具体实现方法
  void wearShirt(){
    printf("Jungle wear Football Shirt\n\n");
  }
};
//抽象工厂类
class AbstractFactory
{
public:
  virtual AbstractBall *getBall() = 0;
  virtual AbstractShirt *getShirt() = 0;
};
//具体工厂类BasketballFactory
class BasketballFactory :public AbstractFactory
{
public:
  BasketballFactory(){
    printf("BasketballFactory\n");
  }
  AbstractBall *getBall(){
    printf("Jungle get basketball\n");
    return new Basketball();
  }
  AbstractShirt *getShirt(){
    printf("Jungle get basketball shirt\n");
    return new BasketballShirt();
  }
};
//具体工厂类BasketballFactory
class FootballFactory :public AbstractFactory
{
public:
  FootballFactory(){
    printf("FootballFactory\n");
  }
  AbstractBall *getBall(){
    printf("Jungle get football\n");
    return new Football();
  }
  AbstractShirt *getShirt(){
    printf("Jungle get football shirt\n");
    return new FootballShirt();
  }
};

三、客户端代码

#include <iostream>
#include "AbstractFactory.h"
int main()
{
  printf("抽象工厂模式\n");
  //定义工厂类对象和产品类对象
  AbstractFactory *fac = NULL;
  AbstractBall *ball = NULL;
  AbstractShirt *shirt = NULL;
  fac = new BasketballFactory();
  ball = fac->getBall();
  shirt = fac->getShirt();
  fac = new FootballFactory();
  ball = fac->getBall();
  shirt = fac->getShirt();
  system("pause");
  return 0;
}

image.png

相关文章
|
6月前
|
设计模式
**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合
【6月更文挑战第23天】**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合。工厂模式专注于单个对象,通过具体工厂创建具体产品,适用于简单对象创建;抽象工厂则关注一系列相关产品,提供创建一族对象的接口,适用于处理多个不兼容产品族。选择模式基于问题域的复杂性,单个产品需求时用工厂模式,多产品族时用抽象工厂模式。
33 5
|
7月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
|
7月前
|
设计模式 Java
Java一分钟之-设计模式:工厂模式与抽象工厂模式
【5月更文挑战第17天】本文探讨了软件工程中的两种创建型设计模式——工厂模式和抽象工厂模式。工厂模式提供了一个创建对象的接口,延迟实例化到子类决定。过度使用或违反单一职责原则可能导致问题。代码示例展示了如何创建形状的工厂。抽象工厂模式则用于创建一系列相关对象,而不指定具体类,但添加新产品可能需修改现有工厂。代码示例展示了创建颜色和形状的工厂。根据需求选择模式,注意灵活性和耦合度。理解并恰当运用这些模式能提升代码质量。
65 2
|
3月前
|
设计模式 Java
Java设计模式-抽象工厂模式(5)
Java设计模式-抽象工厂模式(5)
|
4月前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
43 1
|
4月前
|
设计模式 XML 存储
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
文章详细介绍了抽象工厂模式,这是一种创建型设计模式,用于提供一个接口以创建一系列相关或相互依赖的对象,而不指定它们具体的类。通过代码示例和结构图,文章展示了抽象工厂模式的动机、定义、结构、优点、缺点以及适用场景,并探讨了如何通过配置文件和反射机制实现工厂的动态创建。
【三】设计模式~~~创建型模式~~~抽象工厂模式(Java)
|
4月前
|
设计模式 Java C语言
设计模式-----------工厂模式之抽象工厂模式(创建型)
抽象工厂模式是一种创建型设计模式,它提供了一个接口用于创建一系列相关或相互依赖的对象,而无需指定具体类,从而增强了程序的可扩展性并确保客户端只使用同一产品族的产品。
设计模式-----------工厂模式之抽象工厂模式(创建型)
|
4月前
|
设计模式 存储 XML
[设计模式]创建型模式-抽象工厂模式
[设计模式]创建型模式-抽象工厂模式
|
5月前
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
46 3
|
5月前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
62 2