Abstract Factory

Abstract Factory

Problem Description

The scenario is in a game, where there are enemies like tanks, airplanes, automobiles and bosses, items like medicines, bullets.

 

This game has two levels: easy and hard. Enemies and items of different level has different appearance, behaviour and other properties. So enemy and item should be abstract classes, enemy and item of a specific level should be instantiation  class.

 

We also regulate any one plays the game only under one level at one time, which means at one time there are only a cluster(level) of objects.

Source

#pragma once

 

class Enemy {

public:

       Enemy(){}

       virtual ~Enemy()=0;

};

 

 

class EasyEnemy : public Enemy

{

public:

       virtual ~EasyEnemy();

protected:

       friend class EasyEnemyFactory;

       EasyEnemy(){}

};

 

 

class HardEnemy : public Enemy

{

public:

       virtual ~HardEnemy();

protected:

       friend class HardEnemyFactory;

       HardEnemy(){}

};

 

 

class Item

{

public:

       virtual ~Item()=0;

protected:

       Item(){}

};

 

 

class EasyItem : public Item

{

public:

       virtual ~EasyItem();

protected:

       friend class EasyEnemyFactory;

       EasyItem(){}

};

 

class HardItem : public Item

{

public:

       virtual ~HardItem();

protected:

       friend class HardEnemyFactory;

       HardItem(){}

};

class EnemyFactory

{

public:

       virtual Enemy* CreateEnemy()=0;

       virtual Item* CreateItem()=0;

};

 

 

class EasyEnemyFactory : public EnemyFactory

{

public:

       virtual EasyEnemy* CreateEnemy();

       virtual EasyItem* CreateItem();

};

 

 

class HardEnemyFactory : public EnemyFactory

{

public:

       virtual HardEnemy* CreateEnemy();

       virtual HardItem* CreateItem();

};

 

 

 

#include "AbstractFactory.h"

 

Enemy::~Enemy()

{

 

}

 

EasyEnemy::~EasyEnemy()

{

 

}

 

HardEnemy::~HardEnemy()

{

 

}

 

Item::~Item()

{

 

}

 

EasyItem::~EasyItem()

{

 

}

 

HardItem::~HardItem()

{

 

}

 

 

EasyEnemy* EasyEnemyFactory::CreateEnemy()

{

       return new EasyEnemy;

}

 

EasyItem* EasyEnemyFactory::CreateItem()

{

       return new EasyItem;

}

 

 

HardEnemy* HardEnemyFactory::CreateEnemy()

{

       return new HardEnemy;

}

 

HardItem* HardEnemyFactory::CreateItem()

{

       return new HardItem;

}

 

Remark

Concrete Product has protected constructor so that we must declare a friend class of the corresponding Concrete Factory. Like this, a system can control all the birth of Concrete Product. Also you can use public constructor and need not a friend class, and you will lose some of the manipulation of object creation.

 

Whether abstract product is abstract class is decided by whether the abstract product can be instantiated.

 

Whether abstract factory only provide an interface or has an implementation is decided by the specific application. Abstract factory can return Null pointer or return an abstract product, if it can be instantiated.

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Abstract Factory 模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。这个模式的主要目的是将客户端代码与具体类的创建分离,从而使客户端代码能够与抽象接口进行交互,而不是与具体实现进行交互。 ### 回答2: Abstract Factory 模式是一种软件设计模式,它提供了一种创建相关或依赖对象族的方法。它属于创建型模式的一种。 Abstract Factory 模式的核心思想是将具体对象的实例化操作封装到接口中,由工厂类来创建这些实例。这样可以隐藏对象的具体实现细节,使得系统更加灵活、可扩展和易于维护。 在 Abstract Factory 模式中,有四个角色: 1. 抽象工厂(Abstract Factory):定义了一系列创建抽象产品对象的方法,所有具体工厂类必须实现这些方法。 2. 具体工厂(Concrete Factory):实现了抽象工厂中定义的创建产品对象的方法,返回具体产品的实例。 3. 抽象产品(Abstract Product):定义了产品对象的通用接口,具体产品类必须实现这些接口。 4. 具体产品(Concrete Product):实现了抽象产品中定义的接口,是具体工厂创建的对象。 Abstract Factory模式是工厂方法模式的升级版,它在产品族的维度上进行了扩展。工厂方法模式只能创建单一类型的产品,而Abstract Factory模式能创建多个类型的产品。这使得Abstract Factory模式更加符合开闭原则,可以方便地扩展新的产品系列。 使用Abstract Factory模式可以将产品的创建和使用解耦,客户端只需要通过抽象接口来获取产品,不用关心具体的实现。同时,具体工厂负责创建产品,符合单一职责原则,提高了代码的可读性和可维护性。 总之,Abstract Factory模式提供了一种抽象的方式来创建相关的对象族,可以有效地降低系统的耦合性,提高系统的灵活性和可扩展性。但是它也增加了系统的复杂性,因此在设计系统时需要权衡利弊。 ### 回答3: Abstract Factory 模式是一种创建型设计模式,它提供了一种创建一系列相关或依赖对象的方法。它通过提供一个接口来创建一组相关的对象,而无需指定具体的类。 在 Abstract Factory 模式中,有一个抽象工厂类,它定义了创建对象的方法。具体的工厂类继承自抽象工厂类,并实现了其中的方法,用于创建具体的对象。每个具体工厂类创建一组相关的对象,这些对象在抽象工厂类中定义的接口下进行操作。 Abstract Factory 模式的最大优势是将客户端代码与具体类解耦,使得具体类的变化不会影响到客户端代码。客户端通过使用抽象工厂类和抽象产品类进行编程,而不是直接依赖于具体的对象。这样,如果需要更换一套创建对象的逻辑,只需要更换具体的工厂类即可,而无需修改客户端代码。这种灵活性使得 Abstract Factory 模式非常适合多对象产品系列的创建。 Abstract Factory 模式还可以保证创建的对象相互之间有关联,从而保持了系统的一致性。在具体工厂类中,只会创建相关的对象,并确保这些对象是一起工作的,它们之间有相互依赖关系。因此,使用 Abstract Factory 模式可以确保一组对象能够协同工作,实现系统的完整功能。 总而言之,Abstract Factory 模式通过提供一个接口来创建一组相关的对象,使得客户端代码与具体类解耦,并保持对象之间的关联。它能够提供灵活性和扩展性,适用于多对象产品系列的创建。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值