1、应用场景
一般适用于产品组合产品族变化不大的情况。
优点:
(1)封装了产品的创建,使得不需要知道具体是哪种产品,只需要知道是哪个工厂就行了。
(2)可以支持不同类型的产品,使得模式灵活性更强。
(3)可以非常方便的使用一族中间的不同类型的产品。
缺点:
(1)结构太过臃肿,如果产品类型比较多,或者产品族类比较多,就会非常难于管理。
(2)每次如果添加一组产品,那么所有的工厂类都必须添加一个方法,这样违背了开放-封闭原则。
2、原理
2.1 概述
充分利用面对对象变成继承的特性,定义抽象对象,在抽象对象中,定义相关的接口,当实体对象需要创建时,就继承抽象对象的接口,在该接口下,实现对其他对象的操作。
2.2 设计步骤:
(1) 创建抽象工厂类,在类中定义创造产品接口;
(2)创建抽象产品类,在类中定义产品实现方法;
(3)继承抽象工厂类,定义实际工厂类,在实际工厂类上实现工厂创造产品的方法(用new创建新产品);
(4)继承抽象产品类,定义实际产品类,在实际产品类中定义实现产品和操作产品的方法;
3、UML类图
4、代码实现
4.1 C++
#include <iostream>
using namespace std;
class ProductA;
class AbstractProductA
{
public:
AbstractProductA();
virtual ~AbstractProductA();
virtual void OperationA()=0;
};
AbstractProductA::AbstractProductA()
{
};
AbstractProductA::~AbstractProductA()
{
};
class ProductA: public AbstractProductA
{
public:
ProductA(){};
~ProductA(){};
void OperationA()
{
cout<<"ProductA"<<endl;
};
};
class AbstractFactory
{
public:
AbstractFactory();
virtual ~AbstractFactory();
virtual AbstractProductA *CreatProductA()=0;
};
AbstractFactory::AbstractFactory()
{
};
AbstractFactory::~AbstractFactory()
{
};
class Factory_1: public AbstractFactory
{
public:
Factory_1(){};
~Factory_1(){};
AbstractProductA *CreatProductA()
{
AbstractProductA * temp =NULL;
temp= new ProductA();
return temp;
};
};
int main()
{
AbstractFactory *Factory1 = new Factory_1();
AbstractProductA *ProductA1= Factory1->CreatProductA();
ProductA1->OperationA();
}
4.2 python
class AbstractProductA():
def __init__(self):
pass
def CreateProductA(self):
pass
class ProductA(AbstractProductA):
def ProductA_Des(self):
print("Create Product\n")
class AbstractFactory():
def __init__(self):
pass
def CreateProduct(self):
pass
class Factory(AbstractFactory):
def CreateProduct():
temp = ProductA()
return temp
if __name__ == "__main__":
Factory_1 = Factory()
Product_1 = Factory.CreateProduct()
Product_1.ProductA_Des()