工厂三兄弟之简单工厂模式

1.简述

工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式。本章将要学习的简单工厂模式是工厂方法模式的“小弟”,它不属于GoF 23种设计模式,但在软件开发中应用也较为频繁,通常将它作为学习其他工厂模式的入门。此外,工厂方法模式还有一位“大哥”——抽象工厂模式。这三种工厂模式各具特色,难度也逐个加大,在软件开发中它们都得到了广泛的应用,成为面向对象软件中常用的创建对象的工具。

2.UML图

对于工厂模式,具体上可以分为三类:

简单工厂模式;
工厂方法模式;
抽象工厂模式。

对于上面的三种工厂模式,从上到下逐步抽象,并且更具一般性。而这篇博文主要讲的是简单工厂模式,后两种会在之后的博文中接着总结。
ProductA、ProductB和ProductC继承自Product虚拟类,Show方法是不同产品的自描述;Factory依赖于ProductA、ProductB和ProductC,Factory根据不同的条件创建不同的Product对象。

3.总结

简单工厂模式提供了专门的工厂类用于创建对象,将对象的创建和对象的使用分离开,它作为一种最简单的工厂模式在软件开发中得到了较为广泛的应用。

  1. 主要优点

    简单工厂模式的主要优点如下:

    (1) 工厂类包含必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的职责,而仅仅“消费”产品,简单工厂模式实现了对象创建和使用的分离。

    (2) 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以在一定程度减少使用者的记忆量。

    (3) 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

  2. 主要缺点

    简单工厂模式的主要缺点如下:

    (1) 由于工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要受到影响。

    (2) 使用简单工厂模式势必会增加系统中类的个数(引入了新的工厂类),增加了系统的复杂度和理解难度。

    (3) 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。

    (4) 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

  3. 适用场景

    在以下情况下可以考虑使用简单工厂模式:

    (1) 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。

    (2) 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。

4.代码展示

#include <iostream>  
using namespace std;

//定义抽象类  
class CAnimal
{
protected:
    int m_weight;   //重量  
public:
    virtual void Cry() = 0;
};

//定义具体类  
class CFish : public CAnimal
{
public:
    virtual void Cry()
    {
        cout << "I am Fish!" << endl;
    }
};

class CBird : public CAnimal
{
public:
    virtual void Cry()
    {
        cout << "I am Bird!" << endl;
    }
};

//定义工厂类  
class CFactory
{
public:
    CAnimal* CreateObj(int flag)
    {
        switch (flag)
        {
        case 0:
            return new CBird();
            break;
        case 1:
            return new CFish();
            break;
        default:
            break;
        }
    }
};

//测试类  
int main(int argc, char* argv[])
{
    //定义工厂对象  
    CFactory factory;
    CAnimal* pAnimal;
    pAnimal = factory.CreateObj(0);
    pAnimal->Cry();
    delete pAnimal;

    pAnimal = factory.CreateObj(1);
    pAnimal->Cry();
    delete pAnimal;
    system("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值