当前位置: 首页 > news >正文

2311C++抽象工厂

1,为啥需要工厂设计模式?工厂设计模式可解决什么问题?

先看一下示例,多态示例.

#include <iostream>
using namespace std;
class Shape {
public:Shape() { }virtual void drawShape(){cout << "base draw shape" << endl;}
};
class Rectangular : public Shape {
public:Rectangular(){ }void drawShape (){cout << "draw rectangular" << endl;}
};
class Triangular : public Shape {
public:Triangular () { }void drawShape (){cout << "draw triangular" << endl;}
};
class Circle : public Shape {
public:Circle(){ }void drawShape (){cout << "draw circle" << endl;}
};
int main()
{Shape *rect = new Rectangular();rect->drawShape();delete rect;Shape *tri = new Triangular();tri->drawShape();delete tri;Shape *cir = new Circle();cir->drawShape();delete cir;/*这里添加许多形状...*/return 0;
}

上述代码示例很简单,想带多态,绘画矩形,三角形,圆等.思考一个问题:如果还要画菱形,椭圆等等.很容易出现N多子类继承基本Shape,main()中的会大量的new XXXX,导致很难维护和扩展代码.

这就是工厂对象设计模式解决的问题之一.

还有,基类并不知道具体要实例化哪一个具体的子类,具体实例化要延迟继承类中.

2,工厂设计模式

工厂创建产品. 产品==>多子产品.

工厂设计模式结构图,该模式下,工厂基类知道如何实例化具体产品

工厂=>具体工厂(创建产品)方法
产品(操作)=>具体产品(操作).

工厂设计模式结构图,延迟到子类中具体实例化对象方法

基本要素:
(1)抽象产品Product;
(2)具体产品ConcreteProduct;
(3)抽象工厂Factory.
(4)具体的工厂ConcreteFactory

下面直接给出代码示例:
头文件

#include <iostream>
using namespace std;
class Computer {
public:Computer();virtual ~Computer() = 0;
private:
};
class DellComputer: public Computer {
public:~DellComputer();DellComputer();
private:
};
class AppleComputer : public Computer {
public:AppleComputer();~AppleComputer();
};
class Factory {
public:Factory();virtual ~Factory() = 0;virtual Computer *CreateComputer(const string &type) = 0;//
private:
//串类型;
};
class ConcreateFactory: public Factory {
public:~ConcreateFactory();ConcreateFactory();Computer *CreateComputer(const string &type);
};//main.cpp
#include "product.h"
#include <iostream>
using namespace std;
Computer::Computer()
{cout << "Computer()" << endl;
}
Computer::~Computer()
{cout << "~Computer()" << endl;
}
DellComputer::DellComputer()
{cout << "DellComputer()" << endl;
}
DellComputer::~DellComputer()
{cout << "~DellComputer()" << endl;
}
AppleComputer::AppleComputer()
{cout << "AppleComputer()" << endl;
}
AppleComputer::~AppleComputer()
{cout << "~AppleComputer()" << endl;
}
Factory::Factory()
{cout << "Factory()" << endl;
}
Factory::~Factory()
{cout << "~Factory()" << endl;
}
ConcreateFactory::ConcreateFactory()
{cout << "ConcreateFactory()" << endl;
}
ConcreateFactory::~ConcreateFactory()
{cout << "~ConcreateFactory()" << endl;
}
Computer *ConcreateFactory::CreateComputer(const string &type)
{if (type == "dell")return new DellComputer();else if (type == "apple")return new AppleComputer();elsethrow invalid_argument("Invalid argument");
}
int main()
{Factory *fac = new ConcreateFactory();Computer *dell = fac->CreateComputer("dell"); //制造`dell`电脑delete dell;Computer *apple = fac->CreateComputer("apple"); //制造苹果电脑delete apple;delete fac;return 0;
}

使用工厂类的好处是,可在工厂类中封装创建对象的逻辑,使代码更模块化和清晰.同时,工厂类按需选择创建不同产品对象,客户代码只需与抽象产品类交互,而不需要了解具体产品类.

这样代码更灵活,且更容易扩展和修改.

3,抽象工厂设计模式

工厂模式仅局限于某一个类,有时候需要为一组相关或依赖的对象提供配套的接口.此时就需要抽象工厂模式了,其实抽象工厂模式工厂模式是一回事.

抽象工厂(创建A,创建B)
=>多个具体工厂(创建A,创建B)
抽象产品A=>具体A1,具体A2
抽象产品B=>具体B1,具体B2

抽象工厂设计模式结构图,抽象工厂设计模式就是工厂模式的扩展版.

假如要为生成的电脑装操作系统,假如Dell--->windows系统,Apple----->IOS系统,再来一个华为电脑,需要装鸿蒙系统等.
头文件

#include <iostream>
using namespace std;
class Computer {
public:Computer();virtual ~Computer() = 0;
private:
};
class DellComputer: public Computer {
public:~DellComputer();DellComputer();
private:
};
class OS {
public:OS();virtual ~OS() = 0;
};
class WindowsOS : public OS {
public:WindowsOS();~WindowsOS();
};
class Factory {
public:Factory();virtual ~Factory() = 0;virtual Computer *CreateComputer() = 0;virtual OS *CreateOS() = 0;
private:
//串类型;
};
class ConcreateFactory: public Factory {
public:~ConcreateFactory();ConcreateFactory();Computer *CreateComputer();OS *CreateOS();
};
//main.cpp
#include "product.h"
#include <iostream>
using namespace std;
Computer::Computer()
{cout << "Computer()" << endl;
}
Computer::~Computer()
{cout << "~Computer()" << endl;
}
DellComputer::DellComputer()
{cout << "DellComputer()" << endl;
}
DellComputer::~DellComputer()
{cout << "~DellComputer()" << endl;
}
OS::OS()
{cout << "OS()" << endl;
}
OS::~OS()
{cout << "~OS()" << endl;
}
WindowsOS::WindowsOS()
{cout << "WindowsOS()" << endl;
}
WindowsOS::~WindowsOS()
{cout << "~WindowsOS()" << endl;
}
Factory::Factory()
{cout << "Factory()" << endl;
}
Factory::~Factory()
{cout << "~Factory()" << endl;
}
ConcreateFactory::ConcreateFactory()
{cout << "ConcreateFactory()" << endl;
}
ConcreateFactory::~ConcreateFactory()
{cout << "~ConcreateFactory()" << endl;
}
Computer *ConcreateFactory::CreateComputer()
{return new DellComputer();
}
OS *ConcreateFactory::CreateOS()
{return new WindowsOS();
}
int main()
{Factory *fac = new ConcreateFactory();Computer *dell = fac->CreateComputer();OS *os = fac->CreateOS();delete dell;delete os;delete fac;return 0;
}
http://www.lryc.cn/news/221227.html

相关文章:

  • Lavarel定时任务的使用
  • Java开发者的网络安全指南(二)
  • Python基础学习016__UnitTest
  • 一物一码需求,标签制作功能轻松解决
  • 【Linux】七、基础IO
  • Elasticsearch语法之Term query不区分大小写
  • 远程管理SSH服务
  • Linux 实现原理 — NUMA 多核架构中的多线程调度开销与性能优化
  • Oracle锁处理
  • 持续集成交付CICD:安装Jenkins Slave(从节点)
  • Dart(一):Dart入门
  • [动态规划] (十一) 简单多状态 LeetCode 面试题17.16.按摩师 和 198.打家劫舍
  • 【EI会议投稿】第三届计算机、人工智能与控制工程国际学术会议 (CAICE 2024)
  • python 之 列表推导式
  • 【左程云算法全讲2】链表、栈、队列、递归、哈希表和有序表
  • SQL第三次上机作业
  • 前端事件案例补充
  • 3.8 Android eBPF HelloWorld调试(二)
  • xss如何快速提取cookies
  • 在 ASP.NET C# 中用Aspose.PDF将 PDF 页面转换为 JPG 图像
  • Docker Compose安装milvus向量数据库单机版-milvus基本操作
  • 极致性能优化:前端SSR渲染利器Qwik.js | 京东云技术团队
  • ES6~ES13新特性(二)
  • soildwork2022怎么样添加螺纹孔?
  • 【t5 pytorch版源码学习】t5-pegasus-pytorch源码学习
  • 【springboot】spring的Aop结合Redis实现对短信接口的限流
  • 【MedusaSTears】怎么禁用edge浏览器截图功能?
  • 【计算机网络】(谢希仁第八版)第三章课后习题答案
  • 批量异步任务处理
  • 宜昌市公安局、点军区政府与中科升哲达成战略合作,共建视频图像联合创新实验室