C++之工厂模式
1 目的
工厂模式:想要生产什么产品,就去new一个什么样的工厂。
2 基本概念
抽象工厂(AbstractFactory)
工厂方法模式的核心,任何工厂类都必须实现该接口(虚函数重写);
具体工厂(xxxFactory)
是抽象工厂的一个实现,负责实例化产品对象;
抽象产品(AbstractProduct)
是所有由该方法创建出来的所有具体产品的父类,负责描述描述所有市里所共有的接口;
具体产品(xxxProduct)
由该方法创建出的具体的实例对象;
3 图解
分析
1. 具体的工厂继承于抽象的工厂<继承和虚函数重写>
2. 具体的产品继承于抽象的产品<继承和虚函数重写>
3. 抽象的工厂返回值为抽象的产品<面向抽象类编程,实现客户端、工厂、产品的解耦合>
4. 具体的工厂返回值为具体的产品<具体的工厂产生相应具体的产品>
4 函数入口(感受一下)
//**************函数入口******************//
void main()
{
AbstractFactory *factory = NULL; //面向抽象类编程,因此,先定义抽象类指针
AbFruit *fruit = NULL; //面向抽象类编程,因此,先定义抽象类指针
//吃香蕉
factory = new BananaFactory;
fruit = factory->create();
fruit->sayName();
delete fruit;
delete factory;
//吃苹果
factory = new AppleFactory;
fruit = factory->create();
fruit->sayName();
delete fruit;
delete factory;
system("pause");
return;
}
5 源码
#include <iostream>
using namespace std;
//**************抽象类接口*******************//
class AbFruit
{
public:
virtual void sayName() = 0; //1、虚函数(水果)
};
//**************具体实现********************//
class Banana :public AbFruit //2、继承
{
public:
virtual void sayName() //1.1虚函数重写
{
cout << "香蕉" << endl;
}
};
class Apple :public AbFruit
{
public:
virtual void sayName()
{
cout << "苹果" << endl;
}
};
//***************抽象工厂*******************//
class AbstractFactory
{
public:
virtual AbFruit *create() = 0; //抽象工厂类的返回值类型为抽象水果类,建立两者的联系
};
//**************具体工厂********************//
class BananaFactory:public AbstractFactory
{
public:
AbFruit *create() //具体工厂类的返回值类型为抽象水果类,建立两者的联系
{
return new Banana;
}
};
class AppleFactory :public AbstractFactory
{
public:
AbFruit *create()
{
return new Apple;
}
};
//**************函数入口******************//
void main()
{
AbstractFactory *factory = NULL; //面向抽象类编程,因此,先定义抽象类指针
AbFruit *fruit = NULL; //面向抽象类编程,因此,先定义抽象类指针
//吃香蕉
factory = new BananaFactory;
fruit = factory->create();
fruit->sayName();
delete fruit;
delete factory;
//吃苹果
factory = new AppleFactory;
fruit = factory->create();
fruit->sayName();
delete fruit;
delete factory;
system("pause");
return;
}
分析
工厂模式:想要生产什么产品,就去new一个什么样的工厂。
6 开闭原则(增加一个水果类,不修改源代码)
//**************增加一个桃子工厂的类******************//
class PeachFactory :public AbstractFactory
{
public:
AbFruit *create()
{
return new Peach;
}
};
//**************增加一个桃子的类******************//
class Peach :public AbFruit
{
public:
virtual void sayName()
{
cout << "桃子" << endl;
}
};