论坛首页 Java企业应用论坛

工厂模式运用-锻造武器

浏览 5745 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (1)
作者 正文
   发表时间:2008-08-27  

目标:使用一些材料,在一座城市打造出一把武器

 

包含元素

      一、锻造材料:

                1、 源生材料:  源生火焰   源生空气   源生法力    源生之土

                2、 矿石:      氪金锭       恒金锭  

                3、 药水:      超级活力药水      魔能法力药水

 

      二、锻造成品:

                1、 双手锤:   雷霆        

 

                2、 单手锤:   龙拳之锤          

   

      二、锻造地点:

                1、奥格瑞玛 

                2、暴风城

                3、沙塔斯

 

主要逻辑:1、锻造一把武器需要不同数量的材料:雷霆需要3种材料(源生材料、矿石、药水)

                                                                     龙拳之锤需要2种材料(源生材料、矿石)

                2、不同城市锻造武器需要的材料不同:例如:奥格瑞玛(氪金、原生空气、超级活力药水)

                                                                                 沙塔斯(恒金、原生之火、魔能法力药水)

                3、运用抽象工厂模式和工厂方法模式

 

主要代码

    

/*  
 * 抽象工厂接口,负责创建原材料  
 * 运用抽象工厂模式  
 * 原材料包括 矿石类:Ore  
 *          源生类:Primal  
 *          药水类:Potion  
 */  
public interface CityIngredientFactory {   
    public Primal createPrimal();   
    public Ore createOre();   
    public Potion createPotion();   
}  

 

 

/*  
 * 实现抽象材料工厂  
 * 在暴风城锻造城所需要的材料  
 * 氪金 + 原生之火 + 超级活力药水  
 */  
public class CityStormwindFactory implements CityIngredientFactory {   
    //氪金   
    public Ore createOre() {   
        return new OreKrypton();   
    }   
    //原生之火   
    public Primal createPrimal() {   
        return new PrimalMana();   
    }   
    //超级活力药水   
    public Potion createPotion() {   
        return new PotionRed();   
    }   
}  

 

 

/*  
 * 实现抽象材料工厂  
 * 在沙塔斯锻造城所需要的材料  
 */  
public class CityShattrathFactory implements CityIngredientFactory {   
    //恒金   
    public Ore createOre() {   
        return new OreEternium();   
    }   
    //原生之火   
    public Primal createPrimal() {   
        return new PrimalFire();   
    }   
    //魔能法力药水   
    public Potion createPotion() {   
        return new PotionGreen();   
    }   
}  

 

 

/*  
 * 实现抽象材料工厂  
 * 在奥格瑞玛锻造所需要的材料  
 */  
public class CityOrgrimmarFactory implements CityIngredientFactory {   
    //氪金   
    public Ore createOre() {   
        return new OreKrypton();   
    }   
    //原生空气   
    public Primal createPrimal() {   
        return new PrimalAir();   
    }   
    //超级活力药水   
    public Potion createPotion() {   
        return new PotionRed();   
    }   
  
}  

 

 

以上工厂类已经就绪。

下面开始写武器类

 

/*  
 * 工厂类已经就绪,准备武器用到的材料  
 * 要锻造的武器的抽象基类  
 */  
public abstract class Weapon {   
    protected String weaponName;   
    //制作武器将用到的原料   
    protected Ore ore;   
    protected Primal primal;   
    protected Potion potion;   
    //抽象方法用来收集来自“材料工厂”的材料,在子类中实现   
    public abstract void prepare();   
       
    public void makeUp()   
    {   
        System.out.println("==========准备锻造==========");   
    }   
  
    public void make()   
    {   
        System.out.println("==========开始锻造==========");   
        System.out.println("放入材料:");   
        System.out.println("         " + ore.toString());      
        System.out.println("         " + primal.toString());   
        if(null!=potion){   
            System.out.println("         " + potion.toString());   
        }   
    }   
    public void makeEnd()   
    {   
        System.out.println("锻造成品:");   
        System.out.println("         " + this.getWeaponName());    
        System.out.println("==========锻造结束==========");   
    }   
  
    public String getWeaponName() {   
        return weaponName;   
    }   
  
    public void setWeaponName(String weaponName) {   
        this.weaponName = weaponName;   
    }   
       
       
}  

 

/*  
 * 继承自武器的抽象基类  
 * 锻造-龙拳之锤-  
 */  
public class WeaponDragon extends Weapon{   
    CityIngredientFactory cityIngredientFactory;   
    //构造函数中取得一个工厂并储存到一个实例变量中   
    public WeaponDragon(CityIngredientFactory cityIngredientFactory)   
    {   
        this.cityIngredientFactory = cityIngredientFactory;    
    }   
    //覆盖父类方法,获得“材料工厂”的对应的材料对象   
    @Override  
    public void prepare() {   
        //从材料工厂得到正确的材料   
        //龙拳之锤需要2种材料   
        this.ore = cityIngredientFactory.createOre();   
        this.primal = cityIngredientFactory.createPrimal();   
        this.weaponName = "龙拳之锤";   
    }   
}  

  

/*  
 * 继承自武器的抽象基类  
 * 锻造-雷霆-  
 */  
public class WeaponWrath extends Weapon {   
    CityIngredientFactory cityIngredientFactory;   
    //构造函数中取得一个工厂并储存到一个实例变量中   
    public WeaponWrath(CityIngredientFactory cityIngredientFactory)   
    {   
        this.cityIngredientFactory = cityIngredientFactory;    
    }   
  
    @Override  
    public void prepare() {   
        //从材料工厂得到正确的材料   
        //雷霆需要3种材料   
        this.ore = cityIngredientFactory.createOre();   
        this.primal = cityIngredientFactory.createPrimal();   
        this.potion =  cityIngredientFactory.createPotion();   
        this.weaponName = "雷霆";   
    }   
  
}  

 

下面开始打造武器。
在不同的城市、打造需要的材料不同

 

/*  
 * 抽象基类  
 */  
public abstract class ForgeWeapon {   
    //武器的实例   
    Weapon weapon;   
    public void forgeWeaponNow(String weaponType)   
    {   
        weapon = createforgeWeapon(weaponType);   
        weapon.prepare();   
        //锻造步骤   
        weapon.makeUp();   
        weapon.make();   
        weapon.makeEnd();   
    }   
    /*  
     * 实例化在子类进行 运用了工厂方法模式  
     */  
    protected abstract Weapon createforgeWeapon(String city);   
}  

 

 

/*  
 * 奥瑞格玛锻造  
 */  
public class OrgrimmarForgeWeapom extends ForgeWeapon {   
    @Override  
    protected Weapon createforgeWeapon(String type) {   
        Weapon weapon;   
        //因为是在奥瑞格玛锻造,所以实例化一个奥瑞格玛的材料工厂   
        CityIngredientFactory cityIngredientFactory = new CityOrgrimmarFactory();   
        System.out.println("==============您在奥格瑞玛锻造============");   
        //根据传入参数判断锻造哪种武器   
        if(type == "Dragon" || "Dragon".equals(type))   
        {   
            weapon = new WeaponDragon(cityIngredientFactory);   
               
            return weapon;   
        }   
        else if(type == "Wrath" || "Wrath".equals(type))   
        {   
            weapon = new WeaponWrath(cityIngredientFactory);   
            return weapon;   
        }   
        return null;   
    }   
}  

 

 

/*  
 * 沙塔斯城锻造  
 */  
public class ShattrathForgeWeapom extends ForgeWeapon {   
    @Override  
    protected Weapon createforgeWeapon(String type) {   
        Weapon weapon;   
        //因为是在沙塔斯城锻造,所以实例化一个沙塔斯城的材料工厂   
        CityIngredientFactory cityIngredientFactory = new CityShattrathFactory();   
        System.out.println("==============您在沙塔斯城锻造============");   
        //根据传入参数判断锻造哪种武器   
        if(type == "Dragon" || "Dragon".equals(type))   
        {   
            weapon = new WeaponDragon(cityIngredientFactory);   
               
            return weapon;   
        }   
        else if(type == "Wrath" || "Wrath".equals(type))   
        {   
            weapon = new WeaponWrath(cityIngredientFactory);   
            return weapon;   
        }   
        return null;   
    }   
       
}  

 

 

/*  
 * 暴风城锻造  
 */  
public class StormwindForgeWeapom extends ForgeWeapon {   
       
    @Override  
    protected Weapon createforgeWeapon(String type) {   
        Weapon weapon;   
        //因为是在暴风城锻造,所以实例化一个暴风城的材料工厂   
        CityIngredientFactory cityIngredientFactory = new CityStormwindFactory();   
        System.out.println("==============您在暴风城锻造============");   
        //根据传入参数判断锻造哪种武器   
        if(type == "Dragon" || "Dragon".equals(type))   
        {   
            weapon = new WeaponDragon(cityIngredientFactory);   
               
            return weapon;   
        }   
        else if(type == "Wrath" || "Wrath".equals(type))   
        {   
            weapon = new WeaponWrath(cityIngredientFactory);   
            return weapon;   
        }   
        return null;   
    }   
       
}  

 

 

 

 测试类:

 

/*  
 * 锻造武器测试类  
 */  
public class makeWeaponTest extends TestCase {   
    ForgeWeapon forgeWeapon1;   
    ForgeWeapon forgeWeapon2;   
    ForgeWeapon forgeWeapon3;      
    ForgeWeapon forgeWeapon4;   
    //初始化   
    @Override  
    protected void setUp() throws Exception {      
        forgeWeapon1 = new OrgrimmarForgeWeapom();   
        forgeWeapon2 = new ShattrathForgeWeapom();   
        forgeWeapon3 = new ShattrathForgeWeapom();   
        forgeWeapon4 = new StormwindForgeWeapom();   
        System.out.println("*********测试开始*********");                  
    }   
       
    @Override  
    protected void tearDown() throws Exception {   
        System.out.println("*********测试结束*********\n");   
    }   
       
    public  void testforgeWeapon1()   
    {   
        System.out.println("测试1:奥格瑞玛锻造 龙拳之锤");   
        forgeWeapon1.forgeWeaponNow("Dragon");   
    }   
  
    public  void testforgeWeapon2()   
    {   
        System.out.println("测试2:沙塔斯城锻造 龙拳之锤");   
        forgeWeapon2.forgeWeaponNow("Dragon");   
    }   
       
    public  void testforgeWeapon3()   
    {   
        System.out.println("测试3:沙塔斯城锻造 雷霆");   
        forgeWeapon3.forgeWeaponNow("Wrath");   
    }   
       
    public  void testforgeWeapon4()   
    {   
        System.out.println("测试4:暴风城锻造 雷霆");   
        forgeWeapon4.forgeWeaponNow("Wrath");   
    }   
}  

 
测试打印:

*********测试开始*********   
测试1:奥格瑞玛锻造 龙拳之锤   
==============您在奥格瑞玛锻造============   
==========准备锻造==========   
==========开始锻造==========   
放入材料:   
         氪金   
         源生空气   
锻造成品:   
         龙拳之锤   
==========锻造结束==========   
*********测试结束*********   
  
*********测试开始*********   
测试2:沙塔斯城锻造 龙拳之锤   
==============您在沙塔斯城锻造============   
==========准备锻造==========   
==========开始锻造==========   
放入材料:   
         恒金   
         源生火焰   
锻造成品:   
         龙拳之锤   
==========锻造结束==========   
*********测试结束*********   
  
*********测试开始*********   
测试3:沙塔斯城锻造 雷霆   
==============您在沙塔斯城锻造============   
==========准备锻造==========   
==========开始锻造==========   
放入材料:   
         恒金   
         源生火焰   
         魔能法力药水   
锻造成品:   
         雷霆   
==========锻造结束==========   
*********测试结束*********   
  
*********测试开始*********   
测试4:暴风城锻造 雷霆   
==============您在暴风城锻造============   
==========准备锻造==========   
==========开始锻造==========   
放入材料:   
         氪金   
         源生法力   
         超级活力药水   
锻造成品:   
         雷霆   
==========锻造结束==========   
*********测试结束********* 

 

 

知识点:

工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类。

抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。(抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道或关心实际产出的具体产品是什么,这样一来,客户就从具体的产品被解耦)

 

 

水平有限差错在所难免 欢迎提出问题

本文注重的是设计模式的运用,不是探讨游戏开发,请读者注意主题

代码下载在http://everlive.iteye.com/blog/233138

 

 

 

   发表时间:2008-08-27  
貌似只用了简单工厂模式.抽象类用的挺多,好象用的挺熟练的.
0 请登录后投票
   发表时间:2008-08-28  
抽象工厂模式 不算简单吧。。
0 请登录后投票
   发表时间:2008-08-28  
非常好,难得lz有心把wow的东西联系起来.
0 请登录后投票
   发表时间:2008-09-24  

谢谢 LZ
关于工厂的运用实在是很有用,我之前暑假在IBM培训,也接触到了。 感觉真的很强大,好处很多。

由于我是之前刚注册的用户,在你的博客里面下载不到源码,只能看到你帖出来的代码。   你帖出来的代码,貌似没有对材料原料矿石等定义吧。。。
我看了你上面的代码,然后回来后在自己这里对 原料矿石等 进行了补全,很期待我新人级别过后能下载到你的 源码。
呵呵, LZ 看的出真的将 工厂方法用的很娴熟啊, 以后还请多指教了。
0 请登录后投票
   发表时间:2008-09-24  
很好,魔兽都用上了
0 请登录后投票
   发表时间:2008-12-02  
这种形式真的非常不错,支持楼主!
0 请登录后投票
   发表时间:2008-12-13  
里面还用了模板方法吧,不过模板和工厂方法差不多,主要看个人理解吧
0 请登录后投票
   发表时间:2008-12-14   最后修改:2008-12-14
   if(type == "Dragon" || "Dragon".equals(type))     
         {     
             weapon = new WeaponDragon(cityIngredientFactory);     
                  
             return weapon;     
         }     
         else if(type == "Wrath" || "Wrath".equals(type))     
         {     
             weapon = new WeaponWrath(cityIngredientFactory);     
             return weapon;     
         }     
         [b]return null;[/b]    


1.判断中不需要加type == "Dragon",type == "Wrath"

2.return null;应该放到else{}里面。
0 请登录后投票
   发表时间:2008-12-14  
不错,抽象的东西就应该用具体化来阐述,以便更好的理解
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics