创建型模式-抽象工厂

抽象工厂

  •   工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是我们本文将要学习的抽象工厂模式的基本思想。
      比如有一系列产品:鼠标、键盘、耳机。每个厂商都能生产:惠普,联想,戴尔。惠普生产出来的鼠标是惠普鼠标,戴尔生产的键盘是戴尔键盘。


  • UML类图:
    在这里插入图片描述

如果添加工厂:
在这里插入图片描述


如果添加产品:
在这里插入图片描述

鼠标抽象类:

class AbstractMouse
{
public:
	   virtual void ShowName()=0;
};

鼠标的实现:戴尔

class DellMouse:public AbstractMouse
{
public:
	   virtual void ShowName()
	   {
	   	  cout << "我是戴尔鼠标"<< endl;
	   }
};

鼠标的实现:惠普

class HpMouse:public AbstractMouse
{
public:
	   virtual void ShowName()
	   {
	   	  cout << "我是惠普鼠标"<< endl;
	   }
};


键盘抽象类:
class AbstractKeyboard
{
public:
	   virtual void ShowName()=0;
};

键盘的实现:戴尔

class DellKeyboard:public AbstractKeyboard
{
public:
	   virtual void ShowName()
	   {
	   	  cout << "我是戴尔键盘"<< endl;
	   }
};

键盘的实现:惠普

class HpKeyboard:public AbstractKeyboard
{
public:
	   virtual void ShowName()
	   {
	   	  cout << "我是惠普键盘"<< endl;
	   }
};


工厂抽象

class AbstractFactory
{
public:
		virtual AbstractMouse* CreactMouse()=0;
		virtual AbstractKeyboard* CreactKeyboard()=0;
};

戴尔工厂

class DellFactory:public AbstractFactory
{
public:
		virtual AbstractMouse* CreactMouse()
		{
			return new DellMouse;
		}
		
		virtual AbstractKeyboard* CreactKeyboard()
		{
			return new DellKeyboard;
		}
};

惠普工厂

class HpFactory:public AbstractFactory
{
public:
		virtual AbstractMouse* CreactMouse()
		{
			return new HpMouse;
		}
		
		virtual AbstractKeyboard* CreactKeyboard()
		{
			return new HpKeyboard;
		}
};


客户端调用

int main(void)
{
	AbstractFactory *factory=NULL;    //工厂父指针
	AbstractMouse* mouse=NULL;        //鼠标父指针
	AbstractKeyboard* keyboard=NULL;  //键盘父指针

	factory= new HpFactory;            //创建Hp工厂
    mouse = factory -> CreactMouse();   //Hp工厂生产鼠标
    mouse->ShowName();                 //出来的是惠普的鼠标

	keyboard =factory -> CreactKeyboard();  //Hp工厂生产的键盘
	keyboard->ShowName();             //出来的是惠普的键盘


	delete factory;
	delete mouse;
	delete keyboard;
	return 0;
}

结果:
在这里插入图片描述


产品族、产品等级结构概念:
在这里插入图片描述

  • 优点:
       (1)当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用
          某一族的产品。
       (2)产品等级结构添加方便,符合开闭原则。
  • 缺点:
       (1)产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的工厂
          里面添加代码,又要再具体工厂实现中添加代码,还得再实现一个产品。

产品族难扩展,产品等级易扩展

  • 使用场景:
        (1)系统中有多于一个的产品族,而系统只消费其中某一族的产品。
        (2)产品具有多层等级结构

猜你喜欢

转载自blog.csdn.net/zzyczzyc/article/details/83055403