设计模式之抽象工厂模式(C++)

简介: 设计模式之抽象工厂模式(C++)

一、抽象工厂模式是什么?

      抽象工厂模式是一种创建型的软件设计模式,该模式相当于升级版的工厂模式。


      如果说工厂模式对应一个产品系列,那抽象工厂就对应了多个产品系列。比如工厂模式中有鞋子、衣服和裤子可以生产,那抽象工厂模式就会衍生出耐克工厂和阿迪工厂,这两个工厂分别生产各自品牌的鞋子、衣服和裤子,客户只需要选择具体工厂和想要的产品即可。如果想要替换产品系列,也只需要将具体工厂切换为别的品牌就行了。


      抽象工厂模式的优点:

  1. 具体类分离。具体产品类在具体工厂的实现中进行了分离和归类。
  2. 易于更换产品族。当客户想要改变整个产品族时,只需要切换具体工厂即可。
  3. 利于产品一致性。当产品族的各个产品需要在一起执行时,抽象工厂可以确保客户只操作同系列产品,而不会进行跨品牌的组合。

     抽象工厂模式的缺点:

  1. 不利于添加新种类产品。每加一个新的种类,如多一个项链类型的产品,那每一个具体工厂都要进行代码的扩展,且破坏了原先规定的结构,违反了开闭原则。

二、抽象工厂模式

2.1 结构图

      客户端即Main主函数,选择具体工厂(族),通过该工厂产生该系列下的具体产品(苹果和香蕉),切换具体工厂,产生新系列的具体产品。

2.2 代码示例

      场景描述:我联系了一家中国工厂,品尝该厂的苹果和香蕉,吃完后又找到一家美国工厂,品尝他家的苹果和香蕉,对比下口感。

//Prodect.h
/****************************************************/
#pragma once
#include <iostream>
using namespace std;
// 抽象产品类
class Prodect
{
public:
  // 构造函数
  Prodect(int price) :m_price(price) {};
  // 析构函数
  virtual ~Prodect() {};
  // 获取价格
  int getPrice() {
    return m_price;
  }
protected:
  // 产品价格
  int m_price;
};
// 抽象产品细分-苹果
class AppleProdect : public Prodect
{
public:
  // 构造函数
  AppleProdect(int price, string color) :Prodect(price), m_color(color) {};
  // 析构函数
  virtual ~AppleProdect() {};
  // 获取颜色
  string getColor() {
    return m_color;
  }
protected:
  // 颜色
  string m_color;
};
// 抽象产品细分-香蕉
class BananaProdect : public Prodect
{
public:
  // 构造函数
  BananaProdect(int price) :Prodect(price) {};
  // 析构函数
  virtual ~BananaProdect() {};
};
// 具体产品-中国苹果
class ChineseAppleProdect : public AppleProdect
{
public:
  // 构造函数
  ChineseAppleProdect(int price, string color) :AppleProdect(price, color) {
    cout << "获得了一个中国苹果。" << endl;
  };
  // 析构函数
  virtual ~ChineseAppleProdect() {
    cout << "吃掉了一个中国苹果。" << endl;
  };
};
// 具体产品-美国苹果
class AmericanAppleProdect : public AppleProdect
{
public:
  // 构造函数
  AmericanAppleProdect(int price, string color) :AppleProdect(price, color) {
    cout << "获得了一个美国苹果。" << endl;
  };
  // 析构函数
  virtual ~AmericanAppleProdect() {
    cout << "吃掉了一个美国苹果。" << endl;
  };
};
// 具体产品-中国香蕉
class ChineseBananaProdect : public BananaProdect
{
public:
  // 构造函数
  ChineseBananaProdect(int price) :BananaProdect(price) {
    cout << "获得了一个中国香蕉。" << endl;
  };
  // 析构函数
  virtual ~ChineseBananaProdect() {
    cout << "吃掉了一个中国香蕉。" << endl;
  };
};
// 具体产品-美国香蕉
class AmericanBananaProdect : public BananaProdect
{
public:
  // 构造函数
  AmericanBananaProdect(int price) :BananaProdect(price) {
    cout << "获得了一个美国香蕉。" << endl;
  };
  // 析构函数
  virtual ~AmericanBananaProdect() {
    cout << "吃掉了一个美国香蕉。" << endl;
  };
};
//Factory.h
/****************************************************/
#pragma once
#include <iostream>
#include "Prodect.h"
using namespace std;
// 抽象工厂类
class Factory
{
public:
  // 获取苹果
  virtual Prodect* getApple() = 0;
  // 获取香蕉
  virtual Prodect* getBanana() = 0;
};
// 具体工厂类-中国工厂
class ChineseFactory : public Factory
{
public:
  // 获取苹果
  virtual Prodect* getApple() {
    Prodect* prodect = new ChineseAppleProdect(5, "红");
    return prodect;
  }
  // 获取香蕉
  virtual Prodect* getBanana() {
    Prodect* prodect = new ChineseBananaProdect(3);
    return prodect;
  }
};
// 具体工厂类-美国工厂
class AmericanFactory : public Factory
{
public:
  // 获取产品
  virtual Prodect* getApple() {
    Prodect* prodect = new AmericanAppleProdect(4, "黑");
    return prodect;
  }
  // 获取香蕉
  virtual Prodect* getBanana() {
    Prodect* prodect = new AmericanBananaProdect(2);
    return prodect;
  }
};
//main.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "Factory.h"
#include "Prodect.h"
using namespace std;
int main()
{
  cout << "找到中国工厂。" << endl;
  Factory* factoryA = new ChineseFactory();
  Prodect *A = factoryA->getApple();
  Prodect *B = factoryA->getBanana();
  int applePrice = A->getPrice();
  int bananaPrice = B->getPrice();
  int sum = A->getPrice() + B->getPrice();
  cout << "苹果价格:" << applePrice << "元。" << endl;
  cout << "香蕉价格:" << bananaPrice << "元。" << endl;
  cout << "累计消费:" << sum << "元。" << endl;
  cout << "中国苹果" << dynamic_cast<AppleProdect*>(A)->getColor() << "色" << endl;
  delete A;
  delete B;
  delete factoryA;
  cout << "享用完毕。" << endl << endl;
  cout << "找到美国工厂。" << endl;
  Factory* factoryB = new AmericanFactory();
  Prodect *C = factoryB->getApple();
  Prodect *D = factoryB->getBanana();
  applePrice = C->getPrice();
  bananaPrice = D->getPrice();
  sum = C->getPrice() + D->getPrice();
  cout << "苹果价格:" << applePrice << "元。" << endl;
  cout << "香蕉价格:" << bananaPrice << "元。" << endl;
  cout << "累计消费:" << sum << "元。" << endl;
  cout << "美国苹果" << dynamic_cast<AppleProdect*>(C)->getColor() << "色" << endl;
  delete C;
  delete D;
  delete factoryB;
  cout << "享用完毕。不如China。" << endl;
  return 0;
}

     程序结果如下。

       在上述示例中,我们可以看到,这两个工厂都有同样的系列产品(苹果和香蕉),我想体验新的系列产品,只需要更换具体工厂即可。

三、总结

      我尽可能用较通俗的话语和直观的代码例程,来表述我对抽象工厂模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解抽象工厂模式。

      如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

相关文章
|
6月前
|
设计模式
**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合
【6月更文挑战第23天】**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合。工厂模式专注于单个对象,通过具体工厂创建具体产品,适用于简单对象创建;抽象工厂则关注一系列相关产品,提供创建一族对象的接口,适用于处理多个不兼容产品族。选择模式基于问题域的复杂性,单个产品需求时用工厂模式,多产品族时用抽象工厂模式。
33 5
|
7月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
【设计模式】JAVA Design Patterns——Abstract Factory(抽象工厂模式)
|
7月前
|
设计模式 Java
Java一分钟之-设计模式:工厂模式与抽象工厂模式
【5月更文挑战第17天】本文探讨了软件工程中的两种创建型设计模式——工厂模式和抽象工厂模式。工厂模式提供了一个创建对象的接口,延迟实例化到子类决定。过度使用或违反单一职责原则可能导致问题。代码示例展示了如何创建形状的工厂。抽象工厂模式则用于创建一系列相关对象,而不指定具体类,但添加新产品可能需修改现有工厂。代码示例展示了创建颜色和形状的工厂。根据需求选择模式,注意灵活性和耦合度。理解并恰当运用这些模式能提升代码质量。
66 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++中如何实现这两种模式。
47 3
|
5月前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
65 2