首页 > 编程语言 >c++解耦:Factory Method

c++解耦:Factory Method

时间:2024-03-23 14:23:37浏览次数:24  
标签:Core class Factory c++ Processor Method 类型 public

讨论C++语言中如何将通用逻辑与使用到的频繁变化的具体类型解耦。

假设存在以下设计:

/* ================================================================== */
#include <iostream>

class Core {
public:
    ~Core(){}
public:
    void solve(){
        std::cout << "Core->solve" << std::endl;
    }   
};

class Processor {
public:
    ~Processor(){}
public:
    void run() {
        // ...
        Core * core = new Core();
        core->solve();
        // ...
        delete core;
    }   
};

/* ================================================================== */
// 外部调用
void callback() {
    Processor * processor = new Processor();
    processor->run();
    delete processor;
}

业务上每处理一个外部调用,都会创建Processor对象,执行处理流程run,执行流程会创建内部依赖类Core的对象。run流程通用稳定,外部存在多种类型的调用,Core类型与外部调用强相关。

上述设计存在的问题:

Processor类与特定Core类紧耦合,关系是一对一。业务上Processor类是通用类型逻辑,Core类型又与外部强相关,变化趋势明显。稳定流程引入了变化的动作,当外部调用需求持续扩展,每种调用都需要实现对应的Processor类型,拓展性差。代码明显冗余,复用性差;

可以看到,Processor类的紧耦合是 new Core对象操作引入的(产生了编译时依赖),针对创建对象动作的解耦,讨论使用设计模式领域的FactoryMethod思路求解。

优化思路:复用Processor,为new object动作提供一种封装机制,将依赖具体类型转变为依赖某种创建对象的机制,实现上绕开直接创建对象实现解耦,延迟new动作到运行时;

方案:

  1. 抽象Core类型基类,Processor只依赖稳定的抽象类型指针(面向接口);
  2. 抽象Factory类型基类,提供封装Core类型对象的创建动作的方法,交由具体子类overwrite(虚函数),去创建对应具体Core类型的对象(封装变化);
  3. Processor只持有Factory抽象类型的指针(多态),在创建Processor对象时被初始化为具体Factory(运行时才依赖具体类型)。
/* ================================================================== */
class ICore {
public:
    virtual ~ICore(){}
public:
    virtual void solve()=0;
};

class Factory {
public:
    virtual ICore * createInstance()=0;
    virtual ~Factory(){}
};

class Processor {
public:
	Factory * factory;
public:
	Procrssor(Factory * f){
		this->factory = f
	}
	~Processor(){ delete this->factory; }
public:
	void run() {
		// ...
		ICore * core = this->factory->createInstance();
		core->solve();
		// ...
		delete core;
	}
};

class CoreA : public ICore {
public:
    void solve(){
      	// ...
    }
};

class CoreAFactory : public Factory {
public:
    CoreA * createInstance() {
        return new CoreA();
    }
};

/* ================================================================== */
// 外部调用
void callbackA() {
    CoreAFactory * coreAFactory = new CoreAFactory();
    Processor processor = Processor(coreAFactory);
    processor.run();
}

现在扩展上述场景问题,如果Processor中与外部调用强相关的类型有不止一种,还是按FactoryMethod解耦的思路,讨论下面两种方案的优劣:

  1. 对每种类型封装独立的Factory,Processor中存在多种Factory指针;
  2. 共用Factory,公共Factory统一负责多种类型的实例化,Processor中只存在唯一的Factory指针;

从单一职责角度看,使用多种对象共同协助完成一个流程,可以认为对象之间强相关,这时候将类型交由统一的Factory去负责时合理的。方案1中,假设对Processor实例化时传入负责不同子类型的Factory初始化,从接口实现上看是不安全的,也大概率会引起执行流程错误。

class IAbstractFactory {
public:
  	virtual ICore * createCoreInstance()=0; // 第一种类型
  	virtual IDraw * createDrawInstance()=0; // 第二种类型
  	// ...
};

标签:Core,class,Factory,c++,Processor,Method,类型,public
From: https://www.cnblogs.com/linxx-/p/18091063

相关文章

  • 【华为OD】2024年C卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript
    2024年C卷真题题集题库,有2种分数的题目列表,分别是100分的列表、200分的列表需要订阅请看链接:C卷100分真题集质量分:94价格:39.9元C卷200分真题集质量分:94价格:99.9元从2023年11月开始,华为OD题目切换到C卷,基本上大概率会使用半年左右,要在2024年5月之前把这些题目都好好练习一下......
  • CanvasRenderingContext2D: setLineDash() method格式说明
    定义setLineDash(segments)segments一个数组,用于指定交替绘制直线和间隙的距离(以坐标空间单位表示)。如果数组中元素的个数是奇数,数组中的元素会被复制并连接起来。例如,[5,15,25]将变成[5,15,25,5,15,25]。如果数组为空,破折号列表将被清除,行描边将恢复为实线。例子......
  • Qt/C++通用跨平台Onvif工具/支持海康大华宇视华为天地伟业等/云台控制/预置位管理/工
    一、前言在安防视频监控行业,Onvif作为国际标准,几乎主要的厂商都支持,不仅包含了国内的厂商,也包括主要的国际厂商,由于有了这个标准的存在,使得不同设备不同安防平台之间,能够接入各个厂家的硬件设备,互通有无,你中有我我中有你,实现良性竞争。ONVIF是一个全球性的开放式行业协议,其目标是......
  • 26.C++ STL常用容器—deque
    如果想单独一对一辅导学习C++、Java、Python编程语言的可以加微信咨询3.3deque容器3.3.1deque容器基本概念功能:双端数组,可以对头端进行插入删除操作deque与vector区别:vector对于头部的插入删除效率低,数据量越大,效率越低deque相对而言,对头部的插入删除速度回比v......
  • C++结构体内幕揭秘:sizeof之谜与内存布局探秘
     概述:C++结构体的`sizeof`不总是等于每个成员的`sizeof`之和,因为对齐和填充影响了内存布局。未对齐的结构体可能存在间隙,而对齐的结构体会插入填充以保持对齐。通过示例展示了结构体的内存对齐和填充,以及如何使用模板元编程打印结构体成员的偏移量,深入理解内存布局。在C++中,......
  • 2024届 C++ 刷题 笔试强训 Day 04
    选择题01有以下程序#include<iostream>#include<cstdio>usingnamespacestd;intmain(){intm=0123,n=123;printf("%o%o\n",m,n);return0;}程序运行后的输出结果是()A01230173B0123173C123173D173173题目解析:intm=......
  • 深入理解 C++ 语法:从基础知识到高级应用
    C++语法让我们将以下代码分解以更好地理解它:示例#include<iostream>usingnamespacestd;intmain(){cout<<"HelloWorld!";return0;}示例解释第1行:#include<iostream>是一个头文件库,它让我们可以使用输入和输出对象,比如cout(在第5行使用)。头文件为......
  • C++中const小结
    const修饰普通变量表示变量的值不能被改变。下面两条语句(第2行和第3行)表示的意思一致。inta;constintca=42;//intconstca=42;const修饰指针指向常量的指针不能改变其指对象的值。第5行代码是错误的。inta=42;constint*ip=&a;intconst*ipp=......
  • [c++/gcc] Centos 7.9升级 gcc 4.8.5 到 gcc11 [转]
    0序本文背景:因在centos7.9server上安装nodejs21.7.1,编译nodejs时,依赖了gnu17/gcc11。例如:遇到Qtrequiresc++11support、-std=gnu++17例如:编译器不支持c++17,就会提示:g++:error:unrecognizedcommandlineoption‘-std=c++17’例如:编译器不支持c++17,就会提示:g++:......
  • 【C++ 08】vector 顺序表的常见基本操作
    文章目录前言......