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

【c++之设计模式】组合使用:抽象工厂模式与单例模式

简介

学以致用,使用抽象工厂及单例模式创建不同轿车及轿车装饰品。

代码

    1. 定义一个抽象工厂类来创建不同类型的轿车和轿车装饰品。抽象工厂类中具有创建不同类型轿车和轿车装饰品的纯虚方法。

abstractFactory.h

#pragma once#include "Car.h"
#include "CarDecorate.h"class AbstractFactory
{
public:virtual Car* createCar() = 0;virtual CarDecorate* createDecorate() = 0;
};
  • 2.定义不同类型的轿车,如 SUV 和跑车。

car.h

#pragma once#include <string>class Car
{
public:Car(std::string name) : m_name(name) {}virtual ~Car() {}std::string getName() const { return m_name; }private:std::string m_name;
};class SUV : public Car
{
public:SUV() : Car("SUV") {}
};class SportsCar : public Car
{
public:SportsCar() : Car("SportsCar") {}
};
  • 3.定义不同类型的轿车装饰品,比如车载音响和真皮座椅。

carDecorate.h

#pragma once#include <string>class CarDecorate
{
public:CarDecorate(std::string name) : m_name(name) {}virtual ~CarDecorate() {}std::string getName() const { return m_name; }private:std::string m_name;
};class CarAudio : public CarDecorate
{
public:CarAudio() : CarDecorate("CarAudio") {}
};class LeatherSeat : public CarDecorate
{
public:LeatherSeat() : CarDecorate("LeatherSeat") {}
};
  • 4.创建具体的工厂类,用于创建不同类型轿车及轿车装饰品。使用单例模式来确保每个工厂类只有一个实例。

suvFactory .h

#pragma once#include "AbstractFactory.h"class SUVFactory : public AbstractFactory
{
public:static SUVFactory* getInstance();virtual Car* createCar() override;virtual CarDecorate* createDecorate() override;private:SUVFactory() {}static SUVFactory* m_instance;
};class SportsCarFactory : public AbstractFactory
{
public:static SportsCarFactory* getInstance();virtual Car* createCar() override;virtual CarDecorate* createDecorate() override;private:SportsCarFactory() {}static SportsCarFactory* m_instance;
};

在实现工厂类时,使用单例模式创建工厂类的实例,确保每个工厂只有一个实例。实现工厂类的 createCar() createDecorate() 方法,用于创建不同类型的轿车及轿车装饰品。

suvFactory.cpp

#include "SUVFactory.h"
#include "SportsCarFactory.h"SUVFactory* SUVFactory::m_instance = nullptr;
SportsCarFactory* SportsCarFactory::m_instance = nullptr;SUVFactory* SUVFactory::getInstance()
{if (m_instance == nullptr){m_instance = new SUVFactory();}return m_instance;
}Car* SUVFactory::createCar()
{return new SUV();
}CarDecorate* SUVFactory::createDecorate()
{return new LeatherSeat();
}SportsCarFactory* SportsCarFactory::getInstance()
{if (m_instance == nullptr){m_instance = new SportsCarFactory();}return m_instance;
}Car* SportsCarFactory::createCar()
{return new SportsCar();
}CarDecorate* SportsCarFactory::createDecorate()
{return new CarAudio();
}
  • 5.可以使用工厂类来创建不同类型的轿车及轿车装饰品。

main.cpp

#include <iostream>
#include "SUVFactory.h"
#include "SportsCarFactory.h"int main()
{AbstractFactory* suvFactory = SUVFactory::getInstance();Car* suv = suvFactory->createCar();CarDecorate* suvDecorate = suvFactory->createDecorate();std::cout << suv->getName() << " with " << suvDecorate->getName() << std::endl;AbstractFactory* sportsCarFactory = SportsCarFactory::getInstance();Car* sportsCar = sportsCarFactory->createCar();CarDecorate* sportsCarDecorate = sportsCarFactory->createDecorate();std::cout << sportsCar->getName() << " with " << sportsCarDecorate->getName() << std::endl;return 0;
}

结论

以上就是使用抽象工厂及单例模式结合创建不同轿车及轿车装饰品示例。记录。

http://www.lryc.cn/news/222380.html

相关文章:

  • Adobe Photoshop Elements 2024 v24.0 简体中文版 | 中文直装版
  • seata事务回滚引起的skywalking数据库存储空间剧增的问题排查
  • 数据库SQL
  • C语言实现给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
  • 101 对称二叉树
  • 安全测试,接口返回内容遍历~
  • 【GIS】地理坐标系与投影坐标系的区别
  • 太细了:美团一面连环夺命20问,搞定就60W起
  • 休眠和睡眠有哪些区别?如何让电脑一键休眠?
  • Kibana使用Timelion根据时间序列展示数据
  • 基础:JavaScript的怪癖之一:提升(Hoisting)
  • 前端特殊字符转码
  • Python开发运维:Python3.7安装Django3.2
  • B站双11,联手天猫暴涨2亿消费新势力
  • 如何选择SVM中最佳的【核函数】
  • RT-Thread的构建与配置系统
  • 合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(一)
  • Git的简介以及基本使用
  • django安装数据库
  • springboot--外部环境配置
  • 『MySQL快速上手』-④-表的操作
  • 2023年10月Web3行业月度发展报告区块链篇 |陀螺研究院
  • 【TES745D】青翼自研基于复旦微的FMQL45T900全国产化ARM核心模块(100%国产化)
  • 初次给外贸客户发邮件范文
  • C语言中的多种形式的循环结构
  • 7天入门python系列之第二天python 基础语法
  • 【星海出品】flask 与docker
  • Oracle的to_date()函数解决sql语句日期格式问题
  • Vue实现面经基础版案例(路由+组件缓存)
  • uniapp打开外部链接方式