希赛考试网
首页 > 软考 > 软件设计师

抽象工厂模式实例图

希赛网 2024-06-16 08:23:22

抽象工厂模式是设计模式中的一种,用于创建一些列相互依赖的对象。它提供了一种创建对象的接口,而不必指定它们具体的类。它可以帮助我们轻松地扩展系统功能,真正实现系统的开闭原则。

在这篇文章中,我们将通过一个实例图来了解抽象工厂模式。

实例图

假设我们正在构建一个游戏系统,该系统包含不同的角色和武器类型。为了使系统更加灵活,我们决定使用抽象工厂模式。首先,我们需要定义一系列相关的类:

- 抽象工厂类:用于声明创建抽象对象的方法。

- 具体工厂类:实现抽象工厂类中声明的创建方法。

- 抽象产品类:定义了产品的通用接口。

- 具体产品类:实现抽象产品类的接口,即不同种类的武器和角色。

下面是针对我们游戏系统的类图:

![abstract-factory-pattern-example](https://user-images.githubusercontent.com/58083333/133056523-3a42700b-b193-473b-a572-4aed7f0fcfec.png)

现在,让我们看看每个类的职责和功能。

抽象工厂类

这个类是抽象工厂模式的核心,它声明了所有具体工厂必须实现的方法。在这个示例中,我们定义了两个方法:CreateWeapon()和CreateCharacter()。

```csharp

public abstract class GameFactory

{

public abstract Weapon CreateWeapon();

public abstract Character CreateCharacter();

}

```

具体工厂类

这些类是抽象工厂类的实现,负责创建特定类型的产品。在这个示例中,我们定义了两个具体工厂类:WizardFactory和WarriorFactory。

- WizardFactory:创建魔法师角色和法杖武器。

- WarriorFactory:创建战士角色和剑武器。

```csharp

public class WizardFactory : GameFactory

{

public override Weapon CreateWeapon()

{

return new Wand();

}

public override Character CreateCharacter()

{

return new Wizard();

}

}

public class WarriorFactory : GameFactory

{

public override Weapon CreateWeapon()

{

return new Sword();

}

public override Character CreateCharacter()

{

return new Warrior();

}

}

```

抽象产品类

这个类定义了所有产品的通用接口。在这个示例中,我们定义了两个接口:IWeapon和ICharacter。

```csharp

public interface IWeapon

{

string Name { get; }

int Damage { get; }

}

public interface ICharacter

{

string Name { get; }

void Attack(Weapon weapon, Character target);

}

```

具体产品类

这些类实现了抽象产品类中定义的接口,即具体的武器和角色类型。在这个示例中,我们有四个具体产品类:

- Wand:一种魔法武器。

- Sword:一种近战武器。

- Wizard:一种魔法角色。

- Warrior:一种近战角色。

```csharp

public class Wand : IWeapon

{

public string Name => "Wand";

public int Damage => 20;

}

public class Sword : IWeapon

{

public string Name => "Sword";

public int Damage => 30;

}

public class Wizard : ICharacter

{

public string Name => "Wizard";

public void Attack(Weapon weapon, Character target)

{

Console.WriteLine($"{Name} attacks {target.Name} with {weapon.Name} and deals {weapon.Damage} damage.");

}

}

public class Warrior : ICharacter

{

public string Name => "Warrior";

public void Attack(Weapon weapon, Character target)

{

Console.WriteLine($"{Name} attacks {target.Name} with {weapon.Name} and deals {weapon.Damage} damage.");

}

}

```

使用抽象工厂模式

现在,我们已经定义了所有必要的类,我们可以通过创建对象来使用抽象工厂模式。我们首先定义一个抽象工厂对象,然后通过它来创建具体的产品对象:

```csharp

static void Main(string[] args)

{

GameFactory factory = new WizardFactory();

Weapon weapon = factory.CreateWeapon();

Character character = factory.CreateCharacter();

character.Attack(weapon, new Warrior());

factory = new WarriorFactory();

weapon = factory.CreateWeapon();

character = factory.CreateCharacter();

character.Attack(weapon, new Wizard());

}

```

我们先创建一个WizardFactory对象,然后使用它来创建Wizard对象和Wand对象。接着,我们让Wizard角色攻击一个Warrior角色。然后我们创建了一个WarriorFactory对象,使用它来创建Warrior对象和Sword对象。最后,让Warrior攻击一个Wizard角色。

通过抽象工厂模式,我们可以轻松地扩展游戏系统,添加更多种类的角色和武器。例如,我们可以为游戏添加ArcherFactory,然后为其创建相应的角色和武器类型。

扫码咨询 领取资料


软考.png


软件设计师 资料下载
备考资料包大放送!涵盖报考指南、考情深度解析、知识点全面梳理、思维导图等,免费领取,助你备考无忧!
立即下载
软件设计师 历年真题
汇聚经典真题,展现考试脉络。精准覆盖考点,助您深入备考。细致解析,助您查漏补缺。
立即做题

软考资格查询系统

扫一扫,自助查询报考条件