定义
定义一个可以产生对象的接口,但是让子类决定要产生哪一个类的对象。工厂方法模式让类的实例化程序延迟到子类中实施。
组成部分
Product(产品类)
定义产品类的操作接口,而这个产品将由工厂产生。
ConcreteProduct(产品实现)
实现产品功能的类,可以不只是定义一个产品实现类,这些产品实现类的对象都会由ConcreteCreator(工厂实现类)产生。
Creator(工厂类)
定义能产生Product的方法:FactoryMethod
ConcreteCreator(工厂实现类)
实现FactoryMethod,并产生指定的ConcreteProduct(产品实现)
游戏应用
在设计植物大战僵尸中,植物和僵尸的产生是用了工厂模式
Product
public class IEnemy : ICharacter
{
}
ConcreteProduct
public class EnemyProduct1 : IEnemy
{
}
public class EnemyProduct2 : IEnemy
{
}
Creator
public abstract class ICharacterFactory
{
public abstract void InitPlant(string plantName, int x, int y);
public abstract void InitEnemy(string enemyName, int x, int y);
}
ConcreteCreator
public class CharacterFactory : ICharacterFactory
{
IEnemy enemy;
public override void InitEnemy(string enemyName, int x, int y)
{
if (enemyName == "普通僵尸")
{
enemy = new EnemyProduct1();
}
else if (enemyName == "铁通僵尸")
{
enemy = new EnemyProduct2();
}
//实例化敌人
//GameObject.Instantiate()
//设置武器
//设置属性
}
public override void InitPlant(string plantName, int x, int y)
{
//与敌人一样,就不再描述
}
}
在实例化中可以通过传入字符串或者枚举或者使用泛型都是可以。
优缺点
优点是将类群组对象的产生流程整合与同一个类下实现,并提供唯一的工厂方法,让项目内的对象产生流程更加独立,不过,当类群组过多时,无论使用哪些方式,都会出现工厂子类爆量或switchcase语句过长的问题,这个时美中不足的地方。