1.什么是工厂方法模式?
定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
2.工厂方法模式与抽象工厂模式的区别
工厂方法通常只是创建一个产品等级,而抽象工厂则是创建多个产品等级的,工厂方法模式只有一个方法,创建一种产品,而抽象工厂模式则多个方法,创建一系列的产品,2 工厂方法一般只有一个抽象产品类 而抽象工厂则有多个。
3.工厂方法模式与简单工厂模式的区别
简单工厂模式将逻辑转移到了工厂类中,使得每新增一种产品时需要修改工厂类, 违背了开放-封闭原则 。而工厂方法的出现一定程序上解决了这种情况,定义了一个抽象类,让所有的子类都继承它,而且新增产品时只需要实现继承就行,并把逻辑转移到了客户端中。
工厂模式代码:
#define _CRT_SECURE_NO_WARNINGS
#include "iostream"
using namespace std;
//生成一个水果类
class Fruit
{
public:
virtual void GetFirut() = 0;
};
//分别派生出香蕉、苹果、橘子
class Banana :public Fruit
{
public:
virtual void GetFirut()
{
cout << "香蕉" << endl;
}
};
class Apple :public Fruit
{
public:
virtual void GetFirut()
{
cout << "苹果" << endl;
}
};
class Orange :public Fruit
{
public:
virtual void GetFirut()
{
cout << "橘子" << endl;
}
};
//生成一个水果工厂
class Factory
{
public:
virtual Fruit* GetFactory() = 0;
};
//派生出不同的水果工厂(每个工厂只生产一种水果)
class BananaFactory :public Factory
{
public:
virtual Fruit* GetFactory()
{
return new Banana;
}
};
class AppleFactory :public Factory
{
public:
virtual Fruit* GetFactory()
{
return new Apple;
}
};
class OrangeFactory :public Factory
{
public:
virtual Fruit* GetFactory()
{
return new Orange;
}
};
//想要什么水果,只需要继承工厂派生出水果工厂,与核心类解耦合
int main()
{
Fruit * fruit = NULL;
Factory * factory = NULL;
factory = new BananaFactory; //new一个香蕉工厂,可获得香蕉
fruit = factory->GetFactory();
fruit->GetFirut();
delete fruit;
delete factory;
cout << "-------------------------------------------------" << endl;
factory = new AppleFactory;
fruit = factory->GetFactory();
fruit->GetFirut();
delete fruit;
delete factory;
cout << "-------------------------------------------------" << endl;
factory = new OrangeFactory;
fruit = factory->GetFactory();
fruit->GetFirut();
delete fruit;
delete factory;
system("pause");
return 0;
}