• 抽象工厂模式(c++实现)


    抽象工厂模式

    模式定义

    抽象工厂模式(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,接触分支判断带来的耦合。

    感悟

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

  • 相关阅读:
    Luogu P1596 [USACO10OCT]湖计数Lake Counting
    Luogu P1757 通天之分组背包
    数据建模笔记1
    单纯形算法 matlab
    有效集 matlab代码
    拟牛顿 DFP matlab
    FR共轭梯度法 matlab
    整数规划
    线性规划 Matlab
    远期、期货和互换(三)
  • 原文地址:https://www.cnblogs.com/wzxNote/p/13354686.html
Copyright © 2020-2023  润新知