《星际争霸》与设计模式(1)——简单工厂模式 (转)

本文通过《星际争霸》中的人族造兵情景,介绍了简单工厂模式的概念及其应用。该模式可以根据提供的数据选择创建几种可能的类之一,从而减少客户端与具体实现间的耦合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 在oo程序中,我们经常看到的一种模式就是简单工厂模式(Simple Factory)。简单工厂模式根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个共同的父类和共同的方法,但每个方法执行的任务不同,而且根据不同的数据进行了优化。简单工厂模式实际上不属于23个ooF模式,但它可以作为我们稍后要讨论的工厂方法的一个引导。
    在《星际争霸》的游戏中,为了在资源允许的情况下造出最多的兵,需要根据当时的资源量造不同的兵来实现造兵最大化!我们以人族造机枪兵和喷火兵的情景为例!假设当时的矿资源很充分,当气量大于25时造一个喷火兵,造完后,如果此时的气量小于25时,并不停止造兵,既然无法再造喷火兵,就造一个机枪兵……

None.gifusing System;
None.gif
using System.Collections.Generic;
None.gif
using System.Text;
None.gif
None.gif
namespace starcraft.SimpleFactory
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
public abstract class Terran    //人族
ExpandedSubBlockStart.gifContractedSubBlock.gif
    dot.gif{
InBlock.gif        
public abstract void train();   //造兵
ExpandedSubBlockEnd.gif
    }

InBlock.gif    
public class Marine:Terran      //训练机枪兵
ExpandedSubBlockStart.gifContractedSubBlock.gif
    dot.gif{
InBlock.gif        
public override void train()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Console.WriteLine(
"造出一个机枪兵");
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
public class Firebat : Terran   //训练喷火兵
ExpandedSubBlockStart.gifContractedSubBlock.gif
    dot.gif{
InBlock.gif        
public override void train()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Console.WriteLine(
"造出一个喷火兵");
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
public class Trainfactory    //训练工厂——电脑程序
ExpandedSubBlockStart.gifContractedSubBlock.gif
    dot.gif{
InBlock.gif        
public Terran bestTrain(int gas)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
if(gas<25)      //当气的量超过25时,调用造喷火兵的程序,否则调用造枪兵的程序
ExpandedSubBlockStart.gifContractedSubBlock.gif
            dot.gif{return new Marine();}
InBlock.gif            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{return new Firebat();}
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
class game                //一个具体的游戏
ExpandedSubBlockStart.gifContractedSubBlock.gif
    dot.gif{
InBlock.gif        
static void Main(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Random ra 
= new Random();
InBlock.gif            
int gas;
InBlock.gif            Trainfactory Barracks 
= new Trainfactory();
InBlock.gif            
for (int i = 0; i < 5; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif
InBlock.gif                gas 
= ra.Next(50);  //随即产生气,模拟游戏时电脑实时的剩余气量
InBlock.gif
                Terran terran = Barracks.bestTrain(gas);  //根据气的量开始造一个具体兵
InBlock.gif
                terran.train();   //造兵完成
ExpandedSubBlockEnd.gif
            }

ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

运行结果:

   现在我们在看看game中的main函数,在程序里我们也叫客户层,游戏里我们称为指挥官!具体的兵种类我们陈为具体兵种训练师或具体兵种训练部门。指挥官只需知道现在需要造兵,于是他告诉兵工厂,我们现在有x升气,马上造兵,可造什么兵,如何造他无须知道,这是兵工厂的事,兵工厂根据指挥官提供的信息把造兵任务分配过不同的训练部门!兵工厂的作用是减少了前沿指挥官与训练部门之间的依赖!
   很显然人族兵工厂只能训练出肉体部队,在对手很强的情况下光靠肉体部队很难取得战斗的胜利,还需要机械化部队和高科技!这时简单工厂模式就显得无能为力了!不过每关系,现在游戏才刚刚开始,随着游戏的深入,我们还有其他设计模式来引导大家的生产,微操,战术,直到最后的胜利 

转载于:https://www.cnblogs.com/dircmpt/archive/2006/12/06/583694.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值