抽象工厂模式是设计模式中的一种,用于创建一些列相互依赖的对象。它提供了一种创建对象的接口,而不必指定它们具体的类。它可以帮助我们轻松地扩展系统功能,真正实现系统的开闭原则。
在这篇文章中,我们将通过一个实例图来了解抽象工厂模式。
实例图
假设我们正在构建一个游戏系统,该系统包含不同的角色和武器类型。为了使系统更加灵活,我们决定使用抽象工厂模式。首先,我们需要定义一系列相关的类:
- 抽象工厂类:用于声明创建抽象对象的方法。
- 具体工厂类:实现抽象工厂类中声明的创建方法。
- 抽象产品类:定义了产品的通用接口。
- 具体产品类:实现抽象产品类的接口,即不同种类的武器和角色。
下面是针对我们游戏系统的类图:

现在,让我们看看每个类的职责和功能。
抽象工厂类
这个类是抽象工厂模式的核心,它声明了所有具体工厂必须实现的方法。在这个示例中,我们定义了两个方法: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,然后为其创建相应的角色和武器类型。
扫码咨询 领取资料