设计模式【2】——抽象工厂模式( AbstactFactory 模式)


前言

假设我们要开发一款游戏,当然为了吸引更多的人玩,游戏难度不能太大(让大家都没有信心了,估计游戏也就没有前途了),但是也不能太简单(没有挑战性也不符合玩家的心。理)。于是我们就可以采用这样一种处理策略:为游戏设立等级,初级、中级、高级甚至有BT 级。假设也是过关的游戏,每个关卡都有一些怪物(monster)守着,玩家要把这些怪物干掉才可以过关。作为开发者,我们就不得不创建怪物的类,然后初级怪物、中级怪物等都继承自怪物类(当然不同种类的则需要另创建类,但是模式相同)。在每个关卡,我们都要创建怪物的实例,例如初级就创建初级怪物(有很多种类)、中级创建中级怪物等。可以想象在这个系统中,将会有成千上万的怪物实例要创建,问题是还要保证创建的时候不会出错:初级不能创建 BT 级的怪物(玩家就郁闷了,玩家一郁闷,游戏也就挂挂了),反之也不可以。
AbstractFactory 模式就是用来解决这类问题的:要创建一组相关或者相互依赖的对象。


一、抽象工厂模式(AbstactFactory 模式)

AbstractFactory 模式关键就是将这一组对象的创建封装到一个用于创建对象的类 (ConcreteFactory)中,维护这样一个创建类总比维护 n 多相关对象的创建过程要简单的多。下面是对应的UML图:
AbstactFactory 模式示意图

二、具体源码

1.Product.h

代码如下(示例):

#ifndef _PRODUCT_H_ 
#define _PRODUCT_H_

#include <iostream>

//定义抽象产品类A
class AbstractProductA
{
public:
  //析构函数定义为虚函数
  //作用:虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的目的,而防止内存泄露的
  virtual ~AbstractProductA();

protected:
  AbstractProductA();

private:
};

//定义抽象产品类B
class AbstractProductB
{
public:

virtual ~AbstractProductB();

protected:

  AbstractProductB();

private:
};

//定义具体的产品类A1
class ProductA1 :public AbstractProductA
{
public:

  ProductA1();
  ~ProductA1();

protected:
private:
};

//定义具体的产品类A2
class ProductA2 :public AbstractProductA
{
public:

  ProductA2();
  ~ProductA2();

protected:
private:
};

//定义具体的产品类B1
class ProductB1 :public AbstractProductB
{
public:

  ProductB1();
  ~ProductB1(); 

protected:
private:
};

//定义具体的产品类B2
class ProductB2 :public AbstractProductB
{
public:

  ProductB2();
  ~ProductB2();
protected:
private:
};
#endif //PRODUCT_H

2.Product.cpp

代码如下(示例):

#include "Product.h" 

AbstractProductA::AbstractProductA()
{
}

AbstractProductA::~AbstractProductA()
{
}

AbstractProductB::AbstractProductB()
{
}

AbstractProductB::~AbstractProductB()
{
}

ProductA1::ProductA1()
{
  std::cout << "ProductA1..." << std::endl;
}

ProductA1::~ProductA1()
{
}

ProductA2::ProductA2()
{
  std::cout << "ProductA2..." << std::endl;
}

ProductA2::~ProductA2()
{
}

ProductB1::ProductB1()
{
  std::cout << "ProductB1..." << std::endl;
}

ProductB1::~ProductB1()
{
}

ProductB2::ProductB2()
{
  std::cout << "ProductB2..." << std::endl;
}

ProductB2::~ProductB2()
{
}

3.AbstractFactory.h

代码如下(示例):

#ifndef _ABSTRACTFACTORY_H_ 
#define _ABSTRACTFACTORY_H_ 

#include "Product.h"

//定义工厂的接口,无法实例化
class AbstractFactory
{
   
public:

  virtual ~AbstractFactory();
  virtual AbstractProductA* CreateProductA(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

希望早日退休的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值