锁定老帖子 主题:工厂模式运用-锻造武器
精华帖 (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
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-08-27
貌似只用了简单工厂模式.抽象类用的挺多,好象用的挺熟练的.
|
|
返回顶楼 | |
发表时间:2008-08-28
抽象工厂模式 不算简单吧。。
|
|
返回顶楼 | |
发表时间:2008-08-28
非常好,难得lz有心把wow的东西联系起来.
|
|
返回顶楼 | |
发表时间:2008-09-24
谢谢 LZ 关于工厂的运用实在是很有用,我之前暑假在IBM培训,也接触到了。 感觉真的很强大,好处很多。 由于我是之前刚注册的用户,在你的博客里面下载不到源码,只能看到你帖出来的代码。 你帖出来的代码,貌似没有对材料原料矿石等定义吧。。。 我看了你上面的代码,然后回来后在自己这里对 原料矿石等 进行了补全,很期待我新人级别过后能下载到你的 源码。 呵呵, LZ 看的出真的将 工厂方法用的很娴熟啊, 以后还请多指教了。 |
|
返回顶楼 | |
发表时间:2008-09-24
很好,魔兽都用上了
|
|
返回顶楼 | |
发表时间:2008-12-02
这种形式真的非常不错,支持楼主!
|
|
返回顶楼 | |
发表时间:2008-12-13
里面还用了模板方法吧,不过模板和工厂方法差不多,主要看个人理解吧
|
|
返回顶楼 | |
发表时间: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{}里面。 |
|
返回顶楼 | |
发表时间:2008-12-14
不错,抽象的东西就应该用具体化来阐述,以便更好的理解
|
|
返回顶楼 | |