工厂模式-对象创建模式
定义:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。----《设计模式》GOF
类图:
应用场景:
- 软件系统中,经常面临着创建对象的工作;
- 由于需求的变化,需要创建的对象的具体类型经常变化。
解决问题:
- 应对这种变化。
- 如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?
代码:
#include <iostream>
using namespace std;
/*
创建⼀一个⽔水果抽象类,供具体的⽔水果实现,和抽象⼯工⼚厂返回
*/
class Fruit
{
public:
virtual void getName() = 0;
};
/*
创建⼀一个⼯工⼚厂抽象类,供具体的⽔水果⼯工⼚厂实现,并且返回抽象⽔水果类
*/
class AbstractFactory
{
public: virtual Fruit* createFruit() = 0;
};
class Apple :public Fruit
{
public:
virtual void getName()
{
cout << "我是苹果" << endl;
}
};
class Banana: public Fruit
{
public: virtual void getName()
{
cout << "我是⾹香蕉" << endl;
}
};
//实现了抽象⼯工⼚厂,并且返回⼀一个抽象⽔水果指针
class AppleFactory :public AbstractFactory
{
public:
virtual Fruit* createFruit()
{
return new Apple;
}
};
class BananaFactory : public AbstractFactory
{
public:
virtual Fruit *createFruit()
{
return new Banana;
}
};
/*
此时,如果要想添加⼀一种鸭梨那么不需要再去修改其中任何⼀一个类,⽽而只需要实现⼀一个鸭梨⼯工⼚厂,和⼀一个鸭梨具体类
*/
class Pear : public Fruit
{
public:
virtual void getName()
{
cout<<"我是鸭梨"<<endl;
}
};
class PearFactory : public AbstractFactory
{
public:
virtual Fruit* createFruit()
{
return new Pear;
}
};
int main(void)
{
/*
根据依赖倒转原则,是针对接⼝口的编程,那么,何为针对接⼝口?就是我们只需要使⽤用抽象⼯工⼚厂类的指针,和抽象⽔水果类的指针,通过多态的特性,就可以搞定完成具体类的业务。
*/
AbstractFactory* abFactory=NULL;
Fruit* fruit = NULL;
/*
抽象类指针,完成Apple业务
*/
abFactory = new AppleFactory;
fruit = abFactory-‐>createFruit();
fruit-‐>getName();
delete abFactory;
delete fruit;
/*抽象类指针,完成Banana业务*/
abFactory = new BananaFactory;
fruit = abFactory-‐>createFruit();
fruit-‐>getName();
delete abFactory;
delete fruit;
/*
抽象类指针,完成Banana业务
*/
abFactory = new PearFactory;
fruit = abFactory-‐>createFruit();
fruit-‐>getName();
delete abFactory;
delete fruit;
return 0;
}
小结:
工厂模式可以将对象创建进行隔离,使得对象创建时的紧耦合变成了根据需要创建的松耦合。但是这种工厂方法模式中的每个工厂只能够生产一个对象,这样可能会导致系统中存在大量的工厂类,势必会增加系统的开销。