工厂模式 :定义一个用于创建对象的接口,让子类决定实例化哪一个类。
属于创建型模式。
工厂模式(Factory Pattern): 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
简单工厂模式的实现:
1:逻辑分析:
1:产品的创建交给一个单独的类来管理
2:此类提供全局的访问接口,根据输入条件的不同来创建不同的对象
2:使用分析
1:创建工厂,根据输入的条件来创建对应的产品
2:在创建产品时,返回产品的接口指针
3:通过此指针来操作相应的对象
3:参考demo源码
/**************************************************************
简单工厂:
1.产品的创建交给一个单独的类来管理
2.此类提供全局的访问接口,根据输入条件的不同来创建不同的对象
使用:
1.创建工厂,根据输入的条件来创建对应的产品
2.在创建产品时,返回产品的接口指针
3.通过此指针来操作相应的对象
***************************************************************/
#include <iostream>
#include <string.h>
using namespace std;
class Fruit
{
public:
virtual void getFruit() = 0;
virtual ~Fruit() {};
};
class Banana : public Fruit
{
public:
virtual void getFruit()
{
cout << "香蕉" << endl;
}
};
class Pear : public Fruit
{
public:
virtual void getFruit()
{
cout << "梨子" << endl;
}
};
class Factory
{
public:
static Fruit* Create(const char *name)
{
Fruit *tmp = NULL;
if (strcmp(name, "pear") == 0)
{
tmp = new Pear();
}
else if (strcmp(name, "banana") == 0)
{
tmp = new Banana();
}
else
{
return NULL;
}
return tmp;
}
};
int main()
{
Fruit *pear = Factory::Create("pear");
if (pear == NULL)
{
cout << "创建pear失败\n";
}
pear->getFruit();
Fruit *banana = Factory::Create("banana");
if (banana == NULL)
{
cout << "创建banana失败\n";
}
banana->getFruit();
if(pear != nullptr)
{
delete pear;
pear = nullptr;
}
if(banana != nullptr)
{
delete banana;
banana = nullptr;
}
return 0;
}
思考:这里的工厂类依赖函数的入参决定,内部做判断进行初始化,可以用继承的方式,用特定的类来对其特定工厂进行初始化。
工厂方法模式
逻辑分析:
父类负责定义创建对象的公共接口,子类负责具体以的对象。
类的实例化操作延迟到子类中完成,子类决定创建的对象实例类型。
源码demo:
/*********************************************************
工厂方法:
与简单工厂的区别,将产品的创建分别委托给单独的类,即一个工厂对应一个产品
而不是将所有产品的创建交给一个类来管理
1.首先创建工厂
2.通过此工厂来获取对应的产品(将对象的创建放到工厂中创建)
***********************************************************/
#include <iostream>
#include <string.h>
using namespace std;
//工厂具体产品基类
class Fruit
{
public:
virtual void sayname() = 0;
virtual ~Fruit(){};
};
//工厂对象基类
class FruitFactory
{
public:
virtual Fruit* getFruit() = 0;
virtual void destroyFruit() = 0;
virtual ~FruitFactory() {};
};
//每个产品对应一个产品属性类和工厂创建类
class Banana : public Fruit
{
public:
virtual void sayname()
{
cout << "Banana " << endl;
}
};
//每一个对象的实例化其实就是一个产品
class BananaFactory : public FruitFactory
{
public:
virtual Fruit* getFruit()
{
_ba = new Banana;
return _ba;
}
virtual void destroyFruit()
{
if(_ba != nullptr)
{
delete _ba;
_ba = nullptr;
}
}
public:
Banana* _ba;
};
//每个产品对应一个产品属性类和工厂创建类
class Apple : public Fruit
{
public:
virtual void sayname()
{
cout << "Apple " << endl;
}
};
class AppleFactory : public FruitFactory
{
public:
virtual Fruit* getFruit()
{
_ap = new Apple;
return _ap;
}
virtual void destroyFruit()
{
if(_ap != nullptr)
{
delete _ap;
_ap = nullptr;
}
}
public:
Apple * _ap;
};
int main()
{
FruitFactory * ff = new BananaFactory();
Fruit *fruit = ff->getFruit();
fruit->sayname();
ff->destroyFruit();
// delete fruit;
delete ff;
ff = new AppleFactory();
fruit = ff->getFruit();
fruit->sayname();
ff->destroyFruit();
// delete fruit;
delete ff;
return 0;
}
思考如何扩展:如果产品有多个属性时,可以扩展工厂的函数参数来构造产品。