设计模式——工厂模式

*除了单例模式和观察者监听者模式,本篇再介绍一下工厂模式。。。→_→*

  1. 面向对象编程中出现的问题

    • 在面向对象编程中,可能会会由一种父类派生出许许多多的子类。而当我们在使用new实例化一个子类对象之前,也可能需要进行很多提前操作,比如调用其他的方法、获取相应的参数列表的值、在数据库中查询相关信息等

    • 当类型越来越多、名字越来越复杂的时候,每次去实例化一个子类对象时,都要进行很多提前操作,这就导致了出现了大量的可能产生问题的代码。使得可维护性下降,发生错误的时候查询错误、更正错误就会变得非常困难

  2. 工厂模式的作用

    • 工厂模式的应用实现了代码的高内聚低耦合,其中定义了创建子类对象的接口,封装了子类对象的创建过程,这样我们就不用每次都辛苦的写一堆实例化子类对象的提前操作

    • 工厂模式的应用也使实例化子类对象的操作延迟到了子类中,因为只有在子类中可以决定到底实例化哪一个类

  3. 工厂模式结构示意图

    • 工厂模式
  4. 代码实现

#include <iostream>
#include <vld.h>
using namespace std;

//产品父类
class Product
{
public:
    virtual ~Product() = 0;
protected:
    Product() {};
};
Product::~Product() {}

//产品子类A
class ConcreteProductA : public Product
{ 
public:
    ~ConcreteProductA() {}
    ConcreteProductA() 
    { 
        cout << "ConcreteProductA..." << endl; 
    }
};

//产品子类B
class ConcreteProductB : public Product
{
public:
    ~ConcreteProductB() {}
    ConcreteProductB()
    {
        cout << "ConcreteProductB..." << endl;
    }
};

//产品子类C
class ConcreteProductC : public Product
{
public:
    ~ConcreteProductC() {}
    ConcreteProductC()
    {
        cout << "ConcreteProductC..." << endl;
    }
};

//工厂父类
class Factory
{
public:
    virtual ~Factory() = 0;
    //工厂父类中提供实例化不同产品子类的调用接口,即纯虚函数
    //在工厂子类中重写调用接口,多个调用接口的重载以实现实例化不同的产品子类
    //这样就将实例化产品子类对象的操作延迟到了工厂子类中
    virtual Product* CreateProduct(int num) = 0;
protected:
    Factory() {}
};
Factory::~Factory() {}

//工厂子类
class ConcreteFactory : public Factory
{
public:
    ~ConcreteFactory() {}
    ConcreteFactory()
    { 
        cout << "ConcreteFactory..." << endl; 
    }
    //工厂子类中提供了实例化产品子类的调用接口
    //很好地将提前操作封装起来,实现代码的高内聚低耦合,提高了代码的可维护性和可扩展性
    //可以通过参数switch不同的产品子类的实例化调用接口
    Product* CreateProduct(int num)
    {
        switch (num)
        {
        case 0:
            return new ConcreteProductA();
            break;
        case 1:
            return new ConcreteProductB();
            break;
        case 2:
            return new ConcreteProductC();
            break;
        default:
            break;
        }
    }
};

int main()
{
    Factory* fac = new ConcreteFactory();//创建工厂子类
    //利用工厂子类提供的调用接口实例化某一种产品对象
    Product* pA = fac->CreateProduct(0);
    Product* pB = fac->CreateProduct(1);
    Product* pC = fac->CreateProduct(2);

    delete pA;
    delete pB;
    delete pC;
    delete fac;
    return 0;
}

运行结果

工厂模式运行结果

*码完。。。收工。。。→_→*

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值