设计模式 抽象工厂模式(Abstract Factory Pattern)
一、简述
抽象工厂模式:定义一个创建一些列相关或相互依赖的对象接口,而无需指定它们具体的类。
对比工厂方法模式:(简历举例)
工厂方法模式是 多个工厂,一个工厂创建一个单一的产品。
抽象工厂模式是 多个工厂,一个工厂创建一些相关的产品(比如生产同一个牌子的上衣和裤子、比如生产同一系列但不同款式的衣服)
例子打包:例子打包:外链:https://wwa.lanzoui.com/b0c9joh4b 密码:2vf6
二、UML类图
三、例子
场景:有3个产品工厂,产品工厂A(生产A产品、新款A产品)、产品工厂B(生产B产品、新款B产品),产品工厂C(生产C产品、新款C产品),客户端可以根据用户需要的产品类型自行找对应的产品工厂生产出对应的产品实例。
代码:(C++)
#include <iostream>
using namespace std;
//产品基类
class Product
{
public:
virtual void ProductInfo() = 0;
};
//产品A
class ProductA : public Product
{
public:
void ProductInfo()
{
cout << "ProductA" << endl;
}
};
//产品B
class ProductB : public Product
{
public:
void ProductInfo()
{
cout << "ProductB" << endl;
}
};
//产品C
class ProductC : public Product
{
public:
void ProductInfo()
{
cout << "ProductC" << endl;
}
};
//新产品基类
class NewProduct
{
public:
virtual void ProductInfo() = 0;
};
//New产品A
class NewProductA : public NewProduct
{
public:
void ProductInfo()
{
cout << "NewProductA" << endl;
}
};
//New产品B
class NewProductB : public NewProduct
{
public:
void ProductInfo()
{
cout << "NewProductB" << endl;
}
};
//New产品C
class NewProductC : public NewProduct
{
public:
void ProductInfo()
{
cout << "NewProductC" << endl;
}
};
//产品工厂基类
class ProductFactory
{
public:
virtual Product* CreateProduct() = 0;
virtual NewProduct* CreateNewProduct() = 0;
};
//产品工厂A
class ProductFactoryA : public ProductFactory
{
public:
Product* CreateProduct()
{
return new ProductA();
}
NewProduct* CreateNewProduct()
{
return new NewProductA();
}
};
//产品工厂B
class ProductFactoryB : public ProductFactory
{
public:
Product* CreateProduct()
{
return new ProductB();
}
NewProduct* CreateNewProduct()
{
return new NewProductB();
}
};
//产品工厂C
class ProductFactoryC : public ProductFactory
{
public:
Product* CreateProduct()
{
return new ProductC();
}
NewProduct* CreateNewProduct()
{
return new NewProductC();
}
};
int main(int argc, char *argv[])
{
ProductFactory* productFactory = NULL;
Product* product = NULL;
NewProduct* newproduct = NULL;
//想要产品A
productFactory = new ProductFactoryA();//想要什么类型的产品就修改这里,改为对应的产品工厂
product = productFactory->CreateProduct();
product->ProductInfo();
//新产品A
newproduct = productFactory->CreateNewProduct();
newproduct->ProductInfo();
//想要产品B
productFactory = new ProductFactoryB();
product = productFactory->CreateProduct();
product->ProductInfo();
//新产品B
newproduct = productFactory->CreateNewProduct();
newproduct->ProductInfo();
//想要产品C
productFactory = new ProductFactoryC();
product = productFactory->CreateProduct();
product->ProductInfo();
//新产品C
newproduct = productFactory->CreateNewProduct();
newproduct->ProductInfo();
cin.get();
return 0;
}
效果:
四、总结
4.1 使用场景:有多个产品,但客户端一般只使用一个产品。