在oo程序中,我们经常看到的一种模式就是简单工厂模式(Simple Factory)。简单工厂模式根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个共同的父类和共同的方法,但每个方法执行的任务不同,而且根据不同的数据进行了优化。简单工厂模式实际上不属于23个ooF模式,但它可以作为我们稍后要讨论的工厂方法的一个引导。
在《星际争霸》的游戏中,为了在资源允许的情况下造出最多的兵,需要根据当时的资源量造不同的兵来实现造兵最大化!我们以人族造机枪兵和喷火兵的情景为例!假设当时的矿资源很充分,当气量大于25时造一个喷火兵,造完后,如果此时的气量小于25时,并不停止造兵,既然无法再造喷火兵,就造一个机枪兵……
运行结果:
现在我们在看看game中的main函数,在程序里我们也叫客户层,游戏里我们称为指挥官!具体的兵种类我们陈为具体兵种训练师或具体兵种训练部门。指挥官只需知道现在需要造兵,于是他告诉兵工厂,我们现在有x升气,马上造兵,可造什么兵,如何造他无须知道,这是兵工厂的事,兵工厂根据指挥官提供的信息把造兵任务分配过不同的训练部门!兵工厂的作用是减少了前沿指挥官与训练部门之间的依赖!
很显然人族兵工厂只能训练出肉体部队,在对手很强的情况下光靠肉体部队很难取得战斗的胜利,还需要机械化部队和高科技!这时简单工厂模式就显得无能为力了!不过每关系,现在游戏才刚刚开始,随着游戏的深入,我们还有其他设计模式来引导大家的生产,微操,战术,直到最后的胜利
在《星际争霸》的游戏中,为了在资源允许的情况下造出最多的兵,需要根据当时的资源量造不同的兵来实现造兵最大化!我们以人族造机枪兵和喷火兵的情景为例!假设当时的矿资源很充分,当气量大于25时造一个喷火兵,造完后,如果此时的气量小于25时,并不停止造兵,既然无法再造喷火兵,就造一个机枪兵……
using System;
using System.Collections.Generic;
using System.Text;
namespace starcraft.SimpleFactory
{
public abstract class Terran //人族
{
public abstract void train(); //造兵
}
public class Marine:Terran //训练机枪兵
{
public override void train()
{
Console.WriteLine("造出一个机枪兵");
}
}
public class Firebat : Terran //训练喷火兵
{
public override void train()
{
Console.WriteLine("造出一个喷火兵");
}
}
public class Trainfactory //训练工厂——电脑程序
{
public Terran bestTrain(int gas)
{
if(gas<25) //当气的量超过25时,调用造喷火兵的程序,否则调用造枪兵的程序
{return new Marine();}
else
{return new Firebat();}
}
}
class game //一个具体的游戏
{
static void Main(string[] args)
{
Random ra = new Random();
int gas;
Trainfactory Barracks = new Trainfactory();
for (int i = 0; i < 5; i++)
{
gas = ra.Next(50); //随即产生气,模拟游戏时电脑实时的剩余气量
Terran terran = Barracks.bestTrain(gas); //根据气的量开始造一个具体兵
terran.train(); //造兵完成
}
}
}
}
using System.Collections.Generic;
using System.Text;
namespace starcraft.SimpleFactory
{
public abstract class Terran //人族
{
public abstract void train(); //造兵
}
public class Marine:Terran //训练机枪兵
{
public override void train()
{
Console.WriteLine("造出一个机枪兵");
}
}
public class Firebat : Terran //训练喷火兵
{
public override void train()
{
Console.WriteLine("造出一个喷火兵");
}
}
public class Trainfactory //训练工厂——电脑程序
{
public Terran bestTrain(int gas)
{
if(gas<25) //当气的量超过25时,调用造喷火兵的程序,否则调用造枪兵的程序
{return new Marine();}
else
{return new Firebat();}
}
}
class game //一个具体的游戏
{
static void Main(string[] args)
{
Random ra = new Random();
int gas;
Trainfactory Barracks = new Trainfactory();
for (int i = 0; i < 5; i++)
{
gas = ra.Next(50); //随即产生气,模拟游戏时电脑实时的剩余气量
Terran terran = Barracks.bestTrain(gas); //根据气的量开始造一个具体兵
terran.train(); //造兵完成
}
}
}
}
运行结果:
现在我们在看看game中的main函数,在程序里我们也叫客户层,游戏里我们称为指挥官!具体的兵种类我们陈为具体兵种训练师或具体兵种训练部门。指挥官只需知道现在需要造兵,于是他告诉兵工厂,我们现在有x升气,马上造兵,可造什么兵,如何造他无须知道,这是兵工厂的事,兵工厂根据指挥官提供的信息把造兵任务分配过不同的训练部门!兵工厂的作用是减少了前沿指挥官与训练部门之间的依赖!
很显然人族兵工厂只能训练出肉体部队,在对手很强的情况下光靠肉体部队很难取得战斗的胜利,还需要机械化部队和高科技!这时简单工厂模式就显得无能为力了!不过每关系,现在游戏才刚刚开始,随着游戏的深入,我们还有其他设计模式来引导大家的生产,微操,战术,直到最后的胜利