抽象工厂模式

  • 抽象工厂模式
  • 主要作用
  • 解决的问题
  • 使用场景
  • 优点
  • 缺点
  • 实现


抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

主要作用

提供一个创建一系列相关或者依赖对象的接口,而无需指定他们具体的类。

解决的问题

1.解决接口选择的问题。
2.如果同一家工厂需要生产不止一种产品,那么使用工厂模式会造成工厂过多的情况,使用抽象工厂模式可以使同一个工厂组成一个“产品族”,即可以生产多种产品。

使用场景

当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式。说的更明白一点,就是一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式。假如各个等级结构中的实现类之间不存在关联或约束,则使用多个独立的工厂来对产品进行创建,则更合适一点。

优点

  1. 提供一个创建一系列相关或者依赖对象的接口,而无需指定他们具体的类。
  2. 解决接口选择的问题。
  3. 抽象工厂模式不可以增加产品,但是可以增加产品族
  4. 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
  5. 如果同一家工厂需要生产不止一种产品,那么使用工厂模式会造成工厂过多的情况,使用抽象工厂模式可以使同一个工厂组成一个“产品族”,即可以生产多种产品。

缺点

  1. 产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。

实现

java 抽象工厂模式 结合springioc 抽象工厂模式应用场景_设计模式

#include<iostream>
using namespace std;

//产品1
class Product1
{
	public:
		virtual void show()=0;
};
//产品2
class Product2
{
	public:
		virtual void show()=0;
}; 
//微软的产品1
class MicroProduct1 : public Product1
{
	public:
		void show()
		{
			cout<<"MicroProduct1\n";
		}
};
//微软的产品2
class MicroProduct2 : public Product2
{
	public:
		void show()
		{
			cout<<"MicroProduct2\n";
		}
};
//联想的产品1
class LenovoProduct1 : public Product1
{
	public:
		void show()
		{
			cout<<"LenovoProduct1\n";
		}
};
//联想的产品2
class LenovoProduct2 : public Product2
{
	public:
		void show()
		{
			cout<<"LenovoProduct2\n";
		}
};
//工厂
class Factory
{
	public:
		virtual Product1 * createProduct1()=0;
		virtual Product2 * createProduct2()=0;
};
//微软工厂
class MicroFactory : public Factory
{
	Product1 * createProduct1()
	{
		return new MicroProduct1();
	}
	Product2 * createProduct2()
	{
		return new MicroProduct2();
	}
};
//联想工厂
class LenovoFactory : public Factory
{
	Product1 * createProduct1()
	{
		return new LenovoProduct1();
	}
	Product2 * createProduct2()
	{
		return new LenovoProduct2();
	}
};
int main()
{
	Factory *micro = new MicroFactory();
    Product1 *p1 = micro->createProduct1();
    Product2 *p2 = micro->createProduct2();
    p1->show();
    p2->show();
    cout<<endl;

    Factory *lenovo = new LenovoFactory();
    Product1 *p3 = lenovo->createProduct1();
    Product2 *p4 = lenovo->createProduct2();
    p3->show();
    p4->show();
}

运行结果
MicroProduct1
MicroProduct2

LenovoProduct1
LenovoProduct2