工厂模式运用-锻造武器

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

 包含元素

      一、锻造材料:

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

                2、 矿石:      氪金锭       恒金锭  

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

       二、锻造成品:

                1、 双手锤:   雷霆        

 

                2、 单手锤:   龙拳之锤          

        二、锻造地点:

                1、奥格瑞玛 

                2、暴风城

                3、沙塔斯

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

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

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

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

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

 主要代码    

Java代码 复制代码
  1. /*    
  2.  * 抽象工厂接口,负责创建原材料    
  3.  * 运用抽象工厂模式    
  4.  * 原材料包括 矿石类:Ore    
  5.  *          源生类:Primal    
  6.  *          药水类:Potion    
  7.  */     
  8. public interface CityIngredientFactory {      
  9.     public Primal createPrimal();      
  10.     public Ore createOre();      
  11.     public Potion createPotion();      
  12. }    

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

 

 

Java代码 复制代码
  1. /*    
  2.  * 实现抽象材料工厂    
  3.  * 在暴风城锻造城所需要的材料    
  4.  * 氪金 + 原生之火 + 超级活力药水    
  5.  */     
  6. public class CityStormwindFactory implements CityIngredientFactory {      
  7.     //氪金      
  8.     public Ore createOre() {      
  9.         return new OreKrypton();      
  10.     }      
  11.     //原生之火      
  12.     public Primal createPrimal() {      
  13.         return new PrimalMana();      
  14.     }      
  15.     //超级活力药水      
  16.     public Potion createPotion() {      
  17.         return new PotionRed();      
  18.     }      
  19. }    

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

 

 

Java代码 复制代码
  1. /*    
  2.  * 实现抽象材料工厂    
  3.  * 在沙塔斯锻造城所需要的材料    
  4.  */     
  5. public class CityShattrathFactory implements CityIngredientFactory {      
  6.     //恒金      
  7.     public Ore createOre() {      
  8.         return new OreEternium();      
  9.     }      
  10.     //原生之火      
  11.     public Primal createPrimal() {      
  12.         return new PrimalFire();      
  13.     }      
  14.     //魔能法力药水      
  15.     public Potion createPotion() {      
  16.         return new PotionGreen();      
  17.     }      
  18. }    

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

 

 

Java代码 复制代码
  1. /*    
  2.  * 实现抽象材料工厂    
  3.  * 在奥格瑞玛锻造所需要的材料    
  4.  */     
  5. public class CityOrgrimmarFactory implements CityIngredientFactory {      
  6.     //氪金      
  7.     public Ore createOre() {      
  8.         return new OreKrypton();      
  9.     }      
  10.     //原生空气      
  11.     public Primal createPrimal() {      
  12.         return new PrimalAir();      
  13.     }      
  14.     //超级活力药水      
  15.     public Potion createPotion() {      
  16.         return new PotionRed();      
  17.     }      
  18.      
  19. }    

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

 

 

以上工厂类已经就绪。

下面开始写武器类

 

 

Java代码 复制代码
  1. /*    
  2.  * 工厂类已经就绪,准备武器用到的材料    
  3.  * 要锻造的武器的抽象基类    
  4.  */     
  5. public abstract class Weapon {      
  6.     protected String weaponName;      
  7.     //制作武器将用到的原料      
  8.     protected Ore ore;      
  9.     protected Primal primal;      
  10.     protected Potion potion;      
  11.     //抽象方法用来收集来自“材料工厂”的材料,在子类中实现      
  12.     public abstract void prepare();      
  13.           
  14.     public void makeUp()      
  15.     {      
  16.         System.out.println("==========准备锻造==========");      
  17.     }      
  18.      
  19.     public void make()      
  20.     {      
  21.         System.out.println("==========开始锻造==========");      
  22.         System.out.println("放入材料:");      
  23.         System.out.println("         " + ore.toString());         
  24.         System.out.println("         " + primal.toString());      
  25.         if(null!=potion){      
  26.             System.out.println("         " + potion.toString());      
  27.         }      
  28.     }      
  29.     public void makeEnd()      
  30.     {      
  31.         System.out.println("锻造成品:");      
  32.         System.out.println("         " + this.getWeaponName());       
  33.         System.out.println("==========锻造结束==========");      
  34.     }      
  35.      
  36.     public String getWeaponName() {      
  37.         return weaponName;      
  38.     }      
  39.      
  40.     public void setWeaponName(String weaponName) {      
  41.         this.weaponName = weaponName;      
  42.     }      
  43.           
  44.           
  45. }    

/* * 工厂类已经就绪,准备武器用到的材料 * 要锻造的武器的抽象基类 */ 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; } }

 

Java代码 复制代码
  1. /*    
  2.  * 继承自武器的抽象基类    
  3.  * 锻造-龙拳之锤-    
  4.  */     
  5. public class WeaponDragon extends Weapon{      
  6.     CityIngredientFactory cityIngredientFactory;      
  7.     //构造函数中取得一个工厂并储存到一个实例变量中      
  8.     public WeaponDragon(CityIngredientFactory cityIngredientFactory)      
  9.     {      
  10.         this.cityIngredientFactory = cityIngredientFactory;       
  11.     }      
  12.     //覆盖父类方法,获得“材料工厂”的对应的材料对象      
  13.     @Override     
  14.     public void prepare() {      
  15.         //从材料工厂得到正确的材料      
  16.         //龙拳之锤需要2种材料      
  17.         this.ore = cityIngredientFactory.createOre();      
  18.         this.primal = cityIngredientFactory.createPrimal();      
  19.         this.weaponName = "龙拳之锤";      
  20.     }      
  21. }    

/* * 继承自武器的抽象基类 * 锻造-龙拳之锤- */ 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 = "龙拳之锤"; } }

  

Java代码 复制代码
  1. /*    
  2.  * 继承自武器的抽象基类    
  3.  * 锻造-雷霆-    
  4.  */     
  5. public class WeaponWrath extends Weapon {      
  6.     CityIngredientFactory cityIngredientFactory;      
  7.     //构造函数中取得一个工厂并储存到一个实例变量中      
  8.     public WeaponWrath(CityIngredientFactory cityIngredientFactory)      
  9.     {      
  10.         this.cityIngredientFactory = cityIngredientFactory;       
  11.     }      
  12.      
  13.     @Override     
  14.     public void prepare() {      
  15.         //从材料工厂得到正确的材料      
  16.         //雷霆需要3种材料      
  17.         this.ore = cityIngredientFactory.createOre();      
  18.         this.primal = cityIngredientFactory.createPrimal();      
  19.         this.potion =  cityIngredientFactory.createPotion();      
  20.         this.weaponName = "雷霆";      
  21.     }      
  22.      
  23. }    

/* * 继承自武器的抽象基类 * 锻造-雷霆- */ 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 = "雷霆"; } }

 

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

 

Java代码 复制代码
  1. /*    
  2.  * 抽象基类    
  3.  */     
  4. public abstract class ForgeWeapon {      
  5.     //武器的实例      
  6.     Weapon weapon;      
  7.     public void forgeWeaponNow(String weaponType)      
  8.     {      
  9.         weapon = createforgeWeapon(weaponType);      
  10.         weapon.prepare();      
  11.         //锻造步骤      
  12.         weapon.makeUp();      
  13.         weapon.make();      
  14.         weapon.makeEnd();      
  15.     }      
  16.     /*    
  17.      * 实例化在子类进行 运用了工厂方法模式    
  18.      */     
  19.     protected abstract Weapon createforgeWeapon(String city);      
  20. }    

/* * 抽象基类 */ 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); }

 

 

Java代码 复制代码
  1. /*    
  2.  * 奥瑞格玛锻造    
  3.  */     
  4. public class OrgrimmarForgeWeapom extends ForgeWeapon {      
  5.     @Override     
  6.     protected Weapon createforgeWeapon(String type) {      
  7.         Weapon weapon;      
  8.         //因为是在奥瑞格玛锻造,所以实例化一个奥瑞格玛的材料工厂      
  9.         CityIngredientFactory cityIngredientFactory = new CityOrgrimmarFactory();      
  10.         System.out.println("==============您在奥格瑞玛锻造============");      
  11.         //根据传入参数判断锻造哪种武器      
  12.         if(type == "Dragon" || "Dragon".equals(type))      
  13.         {      
  14.             weapon = new WeaponDragon(cityIngredientFactory);      
  15.                   
  16.             return weapon;      
  17.         }      
  18.         else if(type == "Wrath" || "Wrath".equals(type))      
  19.         {      
  20.             weapon = new WeaponWrath(cityIngredientFactory);      
  21.             return weapon;      
  22.         }      
  23.         return null;      
  24.     }      
  25. }    

/* * 奥瑞格玛锻造 */ 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; } }

 

 

Java代码 复制代码
  1. /*    
  2.  * 沙塔斯城锻造    
  3.  */     
  4. public class ShattrathForgeWeapom extends ForgeWeapon {      
  5.     @Override     
  6.     protected Weapon createforgeWeapon(String type) {      
  7.         Weapon weapon;      
  8.         //因为是在沙塔斯城锻造,所以实例化一个沙塔斯城的材料工厂      
  9.         CityIngredientFactory cityIngredientFactory = new CityShattrathFactory();      
  10.         System.out.println("==============您在沙塔斯城锻造============");      
  11.         //根据传入参数判断锻造哪种武器      
  12.         if(type == "Dragon" || "Dragon".equals(type))      
  13.         {      
  14.             weapon = new WeaponDragon(cityIngredientFactory);      
  15.                   
  16.             return weapon;      
  17.         }      
  18.         else if(type == "Wrath" || "Wrath".equals(type))      
  19.         {      
  20.             weapon = new WeaponWrath(cityIngredientFactory);      
  21.             return weapon;      
  22.         }      
  23.         return null;      
  24.     }      
  25.           
  26. }    

/* * 沙塔斯城锻造 */ 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; } }

 

 

Java代码 复制代码
  1. /*    
  2.  * 暴风城锻造    
  3.  */     
  4. public class StormwindForgeWeapom extends ForgeWeapon {      
  5.           
  6.     @Override     
  7.     protected Weapon createforgeWeapon(String type) {      
  8.         Weapon weapon;      
  9.         //因为是在暴风城锻造,所以实例化一个暴风城的材料工厂      
  10.         CityIngredientFactory cityIngredientFactory = new CityStormwindFactory();      
  11.         System.out.println("==============您在暴风城锻造============");      
  12.         //根据传入参数判断锻造哪种武器      
  13.         if(type == "Dragon" || "Dragon".equals(type))      
  14.         {      
  15.             weapon = new WeaponDragon(cityIngredientFactory);      
  16.                   
  17.             return weapon;      
  18.         }      
  19.         else if(type == "Wrath" || "Wrath".equals(type))      
  20.         {      
  21.             weapon = new WeaponWrath(cityIngredientFactory);      
  22.             return weapon;      
  23.         }      
  24.         return null;      
  25.     }      
  26.           
  27. }    

/* * 暴风城锻造 */ 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; } }

 

 

 

 测试类:

 

Java代码 复制代码
  1. /*    
  2.  * 锻造武器测试类    
  3.  */     
  4. public class makeWeaponTest extends TestCase {      
  5.     ForgeWeapon forgeWeapon1;      
  6.     ForgeWeapon forgeWeapon2;      
  7.     ForgeWeapon forgeWeapon3;         
  8.     ForgeWeapon forgeWeapon4;      
  9.     //初始化      
  10.     @Override     
  11.     protected void setUp() throws Exception {         
  12.         forgeWeapon1 = new OrgrimmarForgeWeapom();      
  13.         forgeWeapon2 = new ShattrathForgeWeapom();      
  14.         forgeWeapon3 = new ShattrathForgeWeapom();      
  15.         forgeWeapon4 = new StormwindForgeWeapom();      
  16.         System.out.println("*********测试开始*********");                     
  17.     }      
  18.           
  19.     @Override     
  20.     protected void tearDown() throws Exception {      
  21.         System.out.println("*********测试结束*********/n");      
  22.     }      
  23.           
  24.     public  void testforgeWeapon1()      
  25.     {      
  26.         System.out.println("测试1:奥格瑞玛锻造 龙拳之锤");      
  27.         forgeWeapon1.forgeWeaponNow("Dragon");      
  28.     }      
  29.      
  30.     public  void testforgeWeapon2()      
  31.     {      
  32.         System.out.println("测试2:沙塔斯城锻造 龙拳之锤");      
  33.         forgeWeapon2.forgeWeaponNow("Dragon");      
  34.     }      
  35.           
  36.     public  void testforgeWeapon3()      
  37.     {      
  38.         System.out.println("测试3:沙塔斯城锻造 雷霆");      
  39.         forgeWeapon3.forgeWeaponNow("Wrath");      
  40.     }      
  41.           
  42.     public  void testforgeWeapon4()      
  43.     {      
  44.         System.out.println("测试4:暴风城锻造 雷霆");      
  45.         forgeWeapon4.forgeWeaponNow("Wrath");      
  46.     }      
  47. }    

/* * 锻造武器测试类 */ 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"); } }

 
测试打印:

Java代码 复制代码
  1. *********测试开始*********      
  2. 测试1:奥格瑞玛锻造 龙拳之锤      
  3. ==============您在奥格瑞玛锻造============      
  4. ==========准备锻造==========      
  5. ==========开始锻造==========      
  6. 放入材料:      
  7.          氪金      
  8.          源生空气      
  9. 锻造成品:      
  10.          龙拳之锤      
  11. ==========锻造结束==========      
  12. *********测试结束*********      
  13.      
  14. *********测试开始*********      
  15. 测试2:沙塔斯城锻造 龙拳之锤      
  16. ==============您在沙塔斯城锻造============      
  17. ==========准备锻造==========      
  18. ==========开始锻造==========      
  19. 放入材料:      
  20.          恒金      
  21.          源生火焰      
  22. 锻造成品:      
  23.          龙拳之锤      
  24. ==========锻造结束==========      
  25. *********测试结束*********      
  26.      
  27. *********测试开始*********      
  28. 测试3:沙塔斯城锻造 雷霆      
  29. ==============您在沙塔斯城锻造============      
  30. ==========准备锻造==========      
  31. ==========开始锻造==========      
  32. 放入材料:      
  33.          恒金      
  34.          源生火焰      
  35.          魔能法力药水      
  36. 锻造成品:      
  37.          雷霆      
  38. ==========锻造结束==========      
  39. *********测试结束*********      
  40.      
  41. *********测试开始*********      
  42. 测试4:暴风城锻造 雷霆      
  43. ==============您在暴风城锻造============      
  44. ==========准备锻造==========      
  45. ==========开始锻造==========      
  46. 放入材料:      
  47.          氪金      
  48.          源生法力      
  49.          超级活力药水      
  50. 锻造成品:      
  51.          雷霆      
  52. ==========锻造结束==========      
  53. *********测试结束*********   

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

 

 

知识点:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值