AbstactFactory 模式(抽象工厂模式)
假如我们要买水果,水果的产地来自中国、日本、美国,每个国家的水果种类都可以分为苹果、香蕉、梨子。作为开发者,我们就不得不创建苹果类(香蕉和梨子类似),然后每种苹果都继承自苹果类。每上架一个国家的苹果我们都要实现一次苹果类,这样就会有成千上万的苹果类需要被创建,AbstractFactory 模式就是用来解决这类问题的:要创建一组相关或者相互依赖的对象。
举例:
代码:
//抽象工厂模式
#include <iostream>
using namespace std;
//苹果的抽象
class AbstractApple {
public:
virtual void showName() = 0;
};
//中国苹果
class ChinaApple :public AbstractApple {
public:
virtual void showName() {
cout << "中国苹果" << endl;
}
};
//美国苹果
class USAApple :public AbstractApple {
public:
virtual void showName() {
cout << "美国苹果" << endl;
}
};
//日本苹果
class JapanApple :public AbstractApple {
public:
virtual void showName() {
cout << "日本苹果" << endl;
}
};
//香蕉的抽象
class AbstractBanana {
public:
virtual void showName() = 0;
};
//中国香蕉
class ChinaBanana :public AbstractBanana {
public:
virtual void showName() {
cout << "中国香蕉" << endl;
}
};
//美国香蕉
class USABanana :public AbstractBanana {
public:
virtual void showName() {
cout << "美国香蕉" << endl;
}
};
//日本香蕉
class JapanBanana :public AbstractBanana {
public:
virtual void showName() {
cout << "日本香蕉" << endl;
}
};
//鸭梨的抽象
class AbstractPear {
public:
virtual void showName() = 0;
};
//中国鸭梨
class ChinaPear :public AbstractPear {
public:
virtual void showName() {
cout << "中国鸭梨" << endl;
}
};
//美国鸭梨
class USAPear :public AbstractPear {
public:
virtual void showName() {
cout << "美国鸭梨" << endl;
}
};
//日本鸭梨
class JapanPear :public AbstractPear {
public:
virtual void showName() {
cout << "日本鸭梨" << endl;
}
};
//抽象工厂 针对产品族
class AbstractFactory {
public:
virtual AbstractApple* CreateApple() = 0;
virtual AbstractBanana* CreateBanana() = 0;
virtual AbstractPear* CreatePear() = 0;
};
//中国工厂
class ChinaFactory :public AbstractFactory {
virtual AbstractApple* CreateApple() {
return new ChinaApple;
}
virtual AbstractBanana* CreateBanana() {
return new ChinaBanana;
}
virtual AbstractPear* CreatePear() {
return new ChinaPear;
}
};
//美国工厂
class USAFactory :public AbstractFactory {
virtual AbstractApple* CreateApple() {
return new USAApple;
}
virtual AbstractBanana* CreateBanana() {
return new USABanana;
}
virtual AbstractPear* CreatePear() {
return new USAPear;
}
};
//日本工厂
class JapanFactory :public AbstractFactory {
virtual AbstractApple* CreateApple() {
return new JapanApple;
}
virtual AbstractBanana* CreateBanana() {
return new JapanBanana;
}
virtual AbstractPear* CreatePear() {
return new JapanPear;
}
};
void test01() {
AbstractFactory* factory = NULL;
AbstractApple* apple = NULL;
AbstractBanana* Banana = NULL;
AbstractPear* Pear = NULL;
//中国工厂
factory = new ChinaFactory;
apple = factory->CreateApple();
Banana = factory->CreateBanana();
Pear = factory->CreatePear();
apple->showName();
Banana->showName();
Pear->showName();
delete Pear;
delete apple;
delete Banana;
delete factory;
}
int main()
{
test01();
}
总结:
AbstractFactory 模式和 Factory模式的区别是初学(使用)设计模式时候的一个容易引起困惑的地方。实际上,AbstractFactory模式是为创建一组(有多类)相关或依赖的对象提供创建接口,而 Factory模式是为一类对象提供创建接口或延迟对象的创建到子类中实现。并且可以看到,AbstractFactory模式通常都是使用 Factory 模式实现。