1、抽象工厂
上篇文章说了工厂方法那么可能有同学有疑问了,既然都已经有工厂方法了,为什么还需要一个抽象工厂呢?抽象工厂是为了解决什么问题呢?在工厂方法中,一个工厂类只负责一个产品的创建,这就比较单一了,比如一个生产处理器的工厂,他可能生产的有i9的处理器,也可能有i5,i3等等,这些都是处理器,这样的话,直接用一个工厂类就不太好了,这时候咱们用抽象工厂。
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的类。
接下来咱们来开发一个游戏,叫暴力摩托。这个游戏有两种模式,一种是普通模式,一种是魔法模式,
普通模式:开摩托,手拿AK47
魔法模式:骑扫把,手拿魔法棒
咱们先来画个类图:
image.png
这样看起来就舒服多了,咱们来简单分析一下这个类图,两个接口
IWeapon
和IVehicle
,一个抽象工厂类,提供了创建两个类的接口。然后就是两个类,一个普通模式的DefaultFactory
一个魔法模式MagicFactory
,这两个类继承自抽象工厂接口类AbstractFactory
,然后就是ak47,摩托,魔法攻击。魔法扫把,四个类的具体实现。然后看代码。
2、代码部分。
IAbstractFactory.cs
namespace AbstractFactory
{
interface IAbstractFactory
{
IWeapon CreateIWeapon(); //提供类的创建接口。
IVehicle CreateIVehicle();
}
}
NormalFactory.cs
namespace AbstractFactory
{
class NormalFactory:IAbstractFactory
{
public IWeapon CreateIWeapon()
{
return new AK47();
}
public IVehicle CreateIVehicle()
{
return new Moto();
}
}
}
MagicFactory.cs
namespace AbstractFactory
{
class MagicFactory:IAbstractFactory
{
public IWeapon CreateIWeapon()
{
return new MagicStick ();
}
public IVehicle CreateIVehicle()
{
return new Broom ();
}
}
}
IVehicle.cs
namespace AbstractFactory
{
interface IVehicle
{
void Run();
}
}
IWeapon.cs
namespace AbstractFactory
{
interface IWeapon
{
void Attack();
}
}
AK47.cs
using System;
namespace AbstractFactory
{
class AK47:IWeapon
{
public void Attack()
{
Console.WriteLine("AK47");
}
}
}
Moto.cs
using System;
namespace AbstractFactory
{
class Moto:IVehicle
{
public void Run()
{
Console.WriteLine("Moto...嘟嘟嘟");
}
}
}
Broom.cs
using System;
namespace AbstractFactory
{
class Broom:IVehicle
{
public void Run()
{
Console.WriteLine("Broom...");
}
}
}
MagicStick.cs
using System;
namespace AbstractFactory
{
class MagicStick : IWeapon
{
public void Attack()
{
Console.WriteLine("MagicStick...");
}
}
}
最后看下program里是如何调用的。
namespace AbstractFactory
{
class Program
{
static void Main(string[] args)
{
IAbstractFactory a = new NormalFactory();
a.CreateIVehicle().Run();
a.CreateIWeapon().Attack();
}
}
}
3、结语
Study hard and make progress every day.
更多学习资料请关注"爱游戏爱编程"。
爱游戏爱编程.jpg
网友评论