抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
设计模式中着重实现了里氏代换原则。
最开始学习的时候使用的例子是抽象冰箱两个类分别继承为三星冰箱与长虹冰箱,抽象电视两个类分别继承为三星电视与长虹电视,这样倒是好理解多了,三星工厂生产三星冰箱与三星电视,长虹工厂生产长虹冰箱与长虹电视,但本人是游戏专业,所以例子中会优先从游戏的角度出发。
下例中的攻击手工厂生产攻击手与剑的组合,枪工厂生产枪手与AK47的组合,当然也可以攻击手与枪来一种组合,但这不符合题意。
类之间的关系参考下图1-1。
图1-1
<code>
// 抽象工厂设计模式
// 工厂方法是为了弥补简单工厂的代码过多缺陷
// 而抽象工厂就是工厂方法多了以后。
/// <summary>
/// 基本类 人物
/// </summary>
abstract class Person
{
// 基本类方法
public abstract void Print();
}
/// <summary>
/// 基本类 武器
/// </summary>
abstract class Weapon
{
// 基本类方法
public abstract void Print();
}
/// <summary>
/// 人物的扩展类1
/// </summary>
class AttackPerson : Person
{
public override void Print()
{
Console.WriteLine("攻击手");
}
}
/// <summary>
/// 人物的扩展类2
/// </summary>
class GunPerson : Person
{
public override void Print()
{
Console.WriteLine("枪 手");
}
}
/// <summary>
/// 武器的扩展类1
/// </summary>
class Sword : Weapon
{
public override void Print()
{
Console.WriteLine("剑");
}
}
/// <summary>
/// 武器的扩展类2
/// </summary>
class AK47 : Weapon
{
public override void Print()
{
Console.WriteLine("AK47");
}
}
/// <summary>
/// 抽象工厂 用来做定义时的基本数据类型
/// </summary>
abstract class AbstractFactory
{
// 抽象方法 用于反馈当前人物信息
public abstract Person person();
// 抽象方法 用于反馈当前武器信息
public abstract Weapon weapon();
}
/// <summary>
/// 攻击手工厂类
/// </summary>
class AttackPersonFactory : AbstractFactory
{
public override Person person()
{
return new AttackPerson();
}
public override Weapon weapon()
{
return new Sword();
}
}
/// <summary>
/// 枪手工厂类
/// </summary>
class GunPersonFactory : AbstractFactory
{
public override Person person()
{
return new GunPerson();
}
public override Weapon weapon()
{
return new AK47();
}
}
/// <summary>
/// 客户类
/// </summary>
public class AbstractFactoryClient
{
public static void Start()
{
AbstractFactory attackPerson = new AttackPersonFactory();
AbstractFactory gunPerson = new GunPersonFactory();
Person person01 = attackPerson.person();
person01.Print();
Weapon person01_weapon = attackPerson.weapon();
person01_weapon.Print();
Person person02 = gunPerson.person();
person02.Print();
Weapon person02_weapon = gunPerson.weapon();
person02_weapon.Print();
}
}
</code>
网友评论