小探设计模式(三)

星期一, 10月 13th, 2008 10:37 上午

抽象工厂

简单工厂解决了对象创建过程和创建逻辑的封装,工厂方法则采用“分而治之”的思想把规模比较大的工厂类分布到各个工厂之类解决。简单工厂和工厂方法模式都是解决了单一产品等级对象创建问题。实际解决问题的时候经常会出现需要创建一系列互相依赖的对象,如果采用工厂方法模式则可能出现创建多个产品额外需要实例化多个工厂类,抽象工厂解决这一问题。

还是使用War3举例(此问题只考虑目标对象,不考虑单位独立性问题,不考虑单位的生产成本和实战问题),NE有角鹰骑士,让AC坐在角鹰背上,一般情况下需要创建一个角鹰其实需要一棵BR然后建一个AC,还需要一棵BW,出一个角鹰,然后要让AC学会骑鸟,显然成本比较高。Orc也有个骑鸟的,双足飞龙,但是它的“驾驶员”和“飞龙”是同时在兽栏被创建,玩家不必为驾驶员和飞龙各自建立工厂,也不必介意那只兽人是如何骑到飞龙上面的,兽栏已经为你做好了一切。

Windrider在创建模式上是一个抽象工厂,但在这里同时也是一个战斗单位,所以要实现战斗单位的接口。兽栏(Beastiary)作为工厂方法引导双足飞龙创建。

战斗单位和工厂的借口就不重复写了。

  1. //Beastiary.java
  2. package warunit;
  3.  
  4. public class Beastiary implements IWarFactory {
  5.  
  6. public IWarUnit train(String type){
  7. if(type.equalsIgnoreCase("windrider")){
  8. return new Windrider();
  9. }
  10. return null;
  11. }
  12. }
  13.  
  14. //Orcman.java
  15. package warunit;
  16.  
  17. public class Orcman implements IWarUnit {
  18.  
  19. public Orcman(){
  20. this.born();
  21. }
  22.  
  23. public void born(){
  24. System.out.print("Ready to soar Master!\n");
  25. }
  26. }
  27.  
  28. //Dragon.java
  29. package warunit;
  30.  
  31. public class Dragon implements IWarUnit {
  32.  
  33. public Dragon(){
  34. this.born();
  35. }
  36.  
  37. public void born(){
  38. System.out.print("Ah~\n");
  39. }
  40. }
  41.  
  42. //AbstractFactory.java
  43. package warunit;
  44.  
  45. public class AbstractFactory {
  46.  
  47. IWarUnit rider;
  48. IWarUnit flyer;
  49. }
  50.  
  51. //Windrider.java
  52. package warunit;
  53.  
  54. public class Windrider extends AbstractFactory implements IWarUnit {
  55.  
  56. public Windrider(){
  57. this.rider=new Orcman();
  58. this.flyer=new Dragon();
  59. }
  60. }
  61.  
  62. //Main.java
  63. import warunit.*;
  64.  
  65. public class Main {
  66.  
  67. public static void main(String[] args){
  68. IWarFactory BE=new Beastiary();
  69. BE.train("windrider");
  70. }
  71. }

发表评论