C++25设计模式之简单工厂模式

本文介绍了简单工厂模式的应用,通过一个具体的例子展示了如何使用工厂类根据参数创建i3和i5电脑主机对象。简单工厂模式实现了对象创建与使用的分离,但存在违背开闭原则的问题。在代码示例中,`MainframeFactory`根据输入参数创建相应的产品对象,调用者只需知道产品名称即可获取所需对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引用至百度
图片引用于百度图片

简介:简单工厂模式提供了专门的工厂类用于创建对象,将对象的创建和对象的使用分离开,不需要关心对象怎么创建的,只需要知道要用的对象名或者枚举名即可。

优点:调用者想创建一个对象,只需要知其名

缺点:违背开闭原则,一旦添加新产品,就必须修改工厂类,并且工厂类集中了所有产品的创建,一旦出错整个项目都会受影响

例子背景:现在客户需要i3和i5电脑主机,而两种主机各方面属性并不相同,所以现在工厂有2个系列的产品,i3和i5的主机

概念:当抽象产品不止一个的时候,工厂怎么知道要创建哪一个产品呢。工厂用一个静态方法。根据参数分别创建i3和i5的产品对象,需要什么给什么,工厂可创建拥有共同特性的所有产品对象。

工厂模式代码:

  • 抽象产品类
#pragma once

class IProduct
{
public:
        virtual ~IProduct() {}
        virtual void PrintProductName() = 0;
};
  • 具体产品类
#pragma once
#include "IProduct.h"
#include <stdio.h>

class i3Mainframe : public IProduct
{
public:
        virtual void PrintProductName()
        {
                printf("我是i3主机\n");
        }
};

class i5Mainframe : public IProduct
{
public:
        virtual void PrintProductName()
        {
                printf("我是i5主机\n");
        }
};
  • 工厂类
#pragma once
#include "Mainframe.h"
#include <string>

class MainframeFactory
{
public:
        static IProduct* CreateProduct(const std::string& pdt)
        {
                if (pdt == "i3")
                {
                        return (new i3Mainframe);
                }
                else if (pdt == "i5")
                {
                        return (new i5Mainframe);
                }

                return nullptr;
        }
};
  • 调用者
#include "MainframeFactory.h"

int main()
{
        IProduct* c = MainframeFactory::CreateProduct("i3");
        IProduct* d = MainframeFactory::CreateProduct("i5");
        c->PrintProductName();
        d->PrintProductName();

        delete c;
        delete d;

        getchar();
        return 0;
}

总结:
简单工厂模式(Simple Factory Pattern):定义一个工厂类,因为被创建的实例都有共同的基类,所以用于创建实例的静态方法可以根据参数的不同返回不同类的实例。

作者:丶梦爱
博客:https://blog.youkuaiyun.com/u014732297(转载请说明出处)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值