惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
IT之家
IT之家
博客园_首页
人人都是产品经理
人人都是产品经理
博客园 - Franky
I
InfoQ
Recent Announcements
Recent Announcements
P
Proofpoint News Feed
H
Hackread – Cybersecurity News, Data Breaches, AI and More
GbyAI
GbyAI
大猫的无限游戏
大猫的无限游戏
aimingoo的专栏
aimingoo的专栏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
月光博客
月光博客
Microsoft Security Blog
Microsoft Security Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog RSS Feed
MongoDB | Blog
MongoDB | Blog
雷峰网
雷峰网
博客园 - 聂微东
N
Netflix TechBlog - Medium
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The GitHub Blog
The GitHub Blog
D
Docker

博客园 - 鬼谷子com

2026年国内主流AI Coding Plan套餐全对比|开发者避坑指南 图解 | 你管这破玩意儿叫TCP?(转载) C++ static_cast、dynamic_cast、const_cast和reinterpret_cast(四种类型转换运算符) Qt内部的d指针和q指针手把手教你实现 C++中虚函数、虚继承内存模型 c++11新特性实战(二):智能指针 windows下使用mingw和msvc静态编译Qt5.15.xx Qt moc元对象编译器的原理和场景(反射) c++结构体内存对齐 c++11新特性实战 (一):多线程操作 迭代器模式(c++实现) 中介者模式(c++实现) 享元模式(c++实现) 代理模式(c++实现) 状态模式(c++实现) 建造者模式(c++实现) 职责链模式(c++实现) 命令模式(c++实现) 模板方法模式(c++实现)
抽象工厂模式(c++实现)
鬼谷子com · 2020-07-21 · via 博客园 - 鬼谷子com

抽象工厂模式

模式定义

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

模式动机

  • 通常是在运行时刻在创建一个ConcreteFactory类的实例,这个具体的工厂再创建具有特定实现的产品对象,也就是说,为创建不同的产品对象,客户端应使用不同的具体工厂。

UML类图

源码实现

  • abstractproducta.h
#include <string>

class AbstracProductA
{
public:
    AbstracProductA();
    virtual ~AbstracProductA();

    void Show();
    virtual std::string Name();
};

class ConcreteProductA1 : public AbstracProductA
{
public:
    ConcreteProductA1();
    std::string Name() override;
};

class ConcreteProductA2 : public AbstracProductA
{
public:
    ConcreteProductA2();
    std::string Name() override;
};
  • abstractfactory.h
#include "abstracproducta.h"
#include "abstracproductb.h"

class AbstractFactory
{
public:
    AbstractFactory();
    virtual ~AbstractFactory();

    virtual AbstracProductA* CreateProductA() = 0;
    virtual AbstracProductB* CreateProductB() = 0;
};

class ConcreteFactory1 : public AbstractFactory
{
public:
    ConcreteFactory1();

    AbstracProductA* CreateProductA() override;
    AbstracProductB* CreateProductB() override;
};

class ConcreteFactory2 : public AbstractFactory
{
public:
    ConcreteFactory2();

    AbstracProductA* CreateProductA() override;
    AbstracProductB* CreateProductB() override;
};
  • main.cpp
#include <iostream>
#include "abstractfactory.h"
#include "abstracproducta.h"
#include "abstracproductb.h"

using namespace std;

int main()
{
    AbstractFactory* factory1 = new ConcreteFactory1();
    AbstracProductA* pA1 = factory1->CreateProductA();
    AbstracProductB* pB1 =factory1->CreateProductB();

    pA1->Show();
    pB1->Show();

    AbstractFactory* factory2 = new ConcreteFactory2();
    AbstracProductA* pA2 = factory2->CreateProductA();
    AbstracProductB* pB2 =factory2->CreateProductB();

    pA2->Show();
    pB2->Show();

    return 0;
}
  • 运行结果

优点

抽象工厂模式的优点

  • 好处是易于交换产品系列,由于具体工厂类,在一个应用中只需要在初始化的时候出现一次,这就使得该百年一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。
  • 它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。

缺点

模式的缺点

  • 所有在用简单工厂的地方,都可以考虑用反射技术来去除switch或if,接触分支判断带来的耦合。

感悟

一个程序员如果从来没有熬夜写程序的经历,不能算是一个好程序猿,因为他没有痴迷过,所以他不会有大成就。