23种设计模式C++源码与UML实现--工厂模式

本文详细介绍了工厂方法模式,强调其作为多态工厂模式的特性,以及与简单工厂模式的区别。在工厂方法模式中,通过接口或抽象类定义创建产品的规范,实现了创建过程的延迟,并允许在不修改核心代码的情况下扩展产品。文章还提供了一个C++实现的示例,展示了如何使用工厂方法模式来创建不同类型的水果对象,如香蕉、苹果和新增的梨,体现了模式的开放封闭原则和良好的扩展性。

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

工厂模式

工厂方法模式同样属于类的创建型模式,又被称为多态工厂模式。工厂方法的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。

核心工厂类不在负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处就是使得工厂方法模式可以使系统不再修改具体工厂角色的情况下引进新的产品。

模式中包含的角色极其职责

抽象工厂角色

工厂方法的核心,任何工厂类都必须实现这个接口

具体工厂角色

具体工厂是抽象工厂的一个实现,负责实例化产品对象。

抽象角色

工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

具体产品

工厂方法模式所创建的具体实例对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5uoWJEma-1602171138325)(picture/image-20201008225409185.png)]

工厂模式和简单工厂模式比较

工厂模式与简单工厂模式在结构上的不同不是很明显,工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体的类上。

工厂方法模式之所以有一个别名叫多态型工厂模式是因为具体工厂类都是共同的接口或者有共同的抽象父类。

当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了 - 开放封闭-原则。而简单工厂模式再添加新产品对象后不得不修改工厂方法,扩展性不好。工厂模式退化后可演变成简单工厂模式。

开放-封闭,通过添加代码的方式,不是通过修改代码的方式完成功能的增强

特点 :不需要修改源代码就可以实现新工能的添加 💛

源码实现:

#include <iostream>
#include <string>

using namespace std;

//  抽象类中定义子类中需要实现的功能,也就是限定了子类必须实现的一些函数
class Fruit
{
public:
    virtual void GetFruit(void) = 0;
    virtual ~Fruit(void)
    {

    }
};

class Banana : public Fruit
{
public:
    virtual void GetFruit(void)
    {
        cout << "I'm banana." << endl;
    }
};


class Apple : public Fruit
{
public:
    virtual void GetFruit(void)
    {
        cout << "I'm apple." << endl;
    }
};

class AbstructFactory
{
public:
    virtual Fruit *CreateProduct(void) = 0;
    // 这里析构函数使用虚函数的原因是因为,只有父类中析构函数使用虚函数,
    // 多态时才会从子类析构函数一直调用到基类结束,否则只会调用父类的不会调用子类的析构函数
    virtual ~AbstructFactory(void)
    {

    }
};

class BananaFactory : public AbstructFactory
{
public:
    virtual Fruit *CreateProduct(void)
    {
        return new Banana;
    }
};

class AppleFactory : public AbstructFactory
{
public:
    virtual Fruit *CreateProduct(void)
    {
        return new Apple;
    }
};

/**
 * 后期产品扩展
 */

class Peer : public Fruit
{
public:
    virtual void GetFruit(void)
    {
        cout << "I'm peer." << endl;
    }
};

class PeerFactory : public AbstructFactory
{
public:
   virtual Fruit *CreateProduct()
   {
       return new Peer;
   }

};

int main(int argc, char const *argv[])
{
    AbstructFactory  *factory = NULL;
    Fruit            *fruit = NULL;

    // 制造香蕉
    factory = new BananaFactory;
    fruit = factory->CreateProduct();
    fruit->GetFruit();

    delete fruit;
    delete factory;

    factory = new AppleFactory;
    fruit = factory->CreateProduct();
    fruit->GetFruit();

    delete fruit;
    delete factory;

    // 前期系统稳定之后,后期扩展
    cout << "extern" << endl;
    factory = new PeerFactory;
    fruit = factory->CreateProduct();
    fruit->GetFruit();
    
    delete fruit;
    delete factory;

    cout << "simple factory test" << endl;
    return 0;
}

编译之后执行结果:

I'm banana.
I'm apple.
extern
I'm peer.
simple factory test
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Achilles.Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值