工厂同时创建两个不同的对象

时间:2013-11-23 13:47:44

标签: java design-patterns factory

如果我有一个2人游戏的程序,它接受用户输入并基于该输入,使用工厂模式创建一个新的player1然后接受更多输入并创建一个新的player2。如果我认为player1总是会成为用户,即没有计算机v电脑游戏。我可以输入一个,要求一种类型的对手,同时创建两个玩家吗?该代码对我有用,但我是否违反了我不应该做的任何事情?

import java.util.ArrayList;
import java.util.List;

public class PlayerFactory {

   public List<Abstract_Player> makePlayerType(String playerType){
       if(playerType.equals("2")){
         List<Abstract_Player> playerList = new ArrayList<Abstract_Player>();
         playerList.add(new Player1());
         playerList.add(new Player2());
         return playerList;
      } else if(playerType.equals("c")){
         List<Abstract_Player> playerList = new ArrayList<Abstract_Player>();
         playerList.add(new Player1());
         playerList.add(new Computer());
         return playerList;
      }
      return null;
   }   
}

1 个答案:

答案 0 :(得分:0)

如果您问工厂是否根据输入返回不同的对象是否有问题,那么不,这正是Factory模式应该做的。

然而,通过使其创建播放器列表而不是播放器类型,您可以使其完成所需的操作。我建议让玩家工厂做一件事 - 创建玩家。然后使用它的代码可以创建列表。这遵循工厂single responsibility的目标,并减少您需要的代码总量。下面的示例代码。

<强> PlayerFactory

import java.util.ArrayList;
import java.util.List;

public class PlayerFactory {

   public Abstract_Player makePlayerType(String playerType){
       if(playerType.equals("2")){
         return new Player2();
      } else if(playerType.equals("c")){
         List<Abstract_Player> playerList = new ArrayList<Abstract_Player>();
         return new Computer();
      }
      throw new IllegalArgumentException("Unknown player type " + playerType);
   }
}

使用播放器工厂的代码

List<Abstract_Player> playerList = new ArrayList<Abstract_Player>();
playerList.add(new Player1());
Abstract_Player opponent = playerFactory.makePlayerType(playerType);
playerlist.add(opponent);