2013-11-23 3 views
0

Если у меня была программа для игры с двумя игроками, в которой пользователь вводил данные и на основе этого ввода, использовал шаблон фабрики для создания нового игрока1, а затем взял больше ввода и создал новый игрок2. Если бы я предполагал, что player1 всегда будет пользователем i.e no Computer v Computer games. Могу ли я вводить один, задавать тип противника и одновременно создавать оба игрока? Код работает для меня, но я нарушаю все, что я не должен делать, делая это?Фабрика, создающая два разных объекта одновременно

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; 
    } 
} 

ответ

0

Если вы спрашиваете, если это проблема, что ваш завод возвращает различные объекты на основе входных данных к нему, то нет, это именно то, что шаблон завод должен делать.

Вы, тем не менее, заставляете его делать больше, чем нужно, создавая список игроков вместо типа игрока. Я бы рекомендовал сделать фабрику игроков одной рукой - создать игроков. Тогда код, который его использует, может создать список. Это следует за целью 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); 
Смежные вопросы