C++设计模式——02抽象工厂模式

抽象工厂模式

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

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

主要作用

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

解决的问题

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

使用场景

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

优点

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

缺点

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

实现

在这里插入图片描述

#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值