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

简介

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

代码

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

abstractFactory.h

cpp 复制代码
#pragma once

#include "Car.h"
#include "CarDecorate.h"

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

car.h

cpp 复制代码
#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

cpp 复制代码
#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

cpp 复制代码
#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

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

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;
}

结论

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

相关推荐
饕餮争锋3 小时前
设计模式笔记_行为型_访问者模式
笔记·设计模式·访问者模式
mit6.8249 小时前
[openvela] Hello World :从零开始的完整实践与问题复盘
c++·嵌入式硬件
啊阿狸不会拉杆11 小时前
《算法导论》第 32 章 - 字符串匹配
开发语言·c++·算法
小学生的信奥之路11 小时前
洛谷P3817题解:贪心算法解决糖果分配问题
c++·算法·贪心算法
曙曙学编程12 小时前
stm32——GPIO
c语言·c++·stm32·单片机·嵌入式硬件
△曉風殘月〆12 小时前
Visual Studio中的常用调试功能(下)
c++·ide·visual studio·调试
武当豆豆12 小时前
C++编程学习(第25天)
开发语言·c++·学习
写bug写bug13 小时前
你真的会用枚举吗
java·后端·设计模式
哆啦code梦14 小时前
趣谈设计模式之策略模式-比特咖啡给你一杯满满的情绪价值,让您在数字世界里”畅饮“
设计模式·策略模式
minji...16 小时前
C++ string类(STL简介 , string类 , 访问修改字符)
开发语言·c++