2015-04-09 7 views
0

Я создал шаблон фабрики для создания своих объектов, но каждый из объектов несколько отличается, и я хочу, чтобы они реализовали разные методы, с моей текущей настройкой я должен объявить все методы в интерфейсе и в последующих классах объектов, как я могу обойти это?Проблемы с интерфейсами и FactoryPattern

Это пример структуры

класс еды

public class Food extends MyObjects implements MyActiveObject, { 

public Food(String name, Coordinates coordinates, int size, Color color) { 
    super(name, coordinates, size, color); 
    } 
} 

Травоядным класс

public class Herbivore extends Entity implements MyActiveObject { 
public Herbivore(String name,Coordinates coordinates, int size, Color color){ 
    super(name, coordinates, size, color); 
} 

}

интерфейс

public interface MyActiveObject extends EntityInterface { 

    public Coordinates getCoordinates(); 
    etc... 
} 

Фабрика класса

public class MyActiveObjectFactory { 

public MyActiveObject createObject(String objectType, int objectCount, int x, int y, int scale){ 

    if(objectType == null){ 
     return null; 
    }else{ 

     if(objectType.equalsIgnoreCase("HERBIVORE")){ 
      return new Herbivore(); 
     } 
     else if(objectType.equalsIgnoreCase("CARNIVORE")){ 
      return new Carnivore(); 
     } 
     else if(objectType.equalsIgnoreCase("FOOD")){ 
      return new Food(); 
     } 
     else if(objectType.equalsIgnoreCase("DRINK")){ 
      return new Drink(); 
     } 
    } 
    return null; 
} 

Создание объекта

MyActiveObject activeObject = activeObjectFactory.createObject("Herbivore", activeObjectCount, x, y, scale); 

Ive удалены любые unessary код, чтобы сэкономить место, что им пытаются сделать, это магазин продуктов питания и травоядное как ActiveObject в массиве, но я хочу быть в состоянии вызвать разные методы для каждого из них, я не могу изменить их на абстрактный класс из-за наследования, так что все идеи, может ли кто-нибудь помочь?

Спасибо заранее

ответ

1

Может быть, я недоразумение ваш вопрос, но почему вы не можете иметь что-то вроде этого? Метод getCoordinates определен в интерфейсе и реализован в каждом классе, но каждый класс также имеет свои собственные методы.

public class Test{ 
    private MyActiveObject[] mObjList = new MyActiveObject[ 4 ]; 

    public Test(){ 
     mObjList[0] = new Food(); 
     mObjList[1] = new Drink(); 
     mObjList[2] = new Herbivore(); 
     mObjList[3] = new Carnivore(); 
    } 

    public void doTest(){ 
     for(MyActiveObject obj : mObjList){ 
      obj.getCoordinates(); // No conversion required for common method 

      if(obj instanceof Herbivore){ 
       Herbivore newObj = (Herbivore) obj; 
       newObj.doHerbivoreWork(); 
      } 
      else if(obj instanceof Carnivore){ 
       Carnivore newObj = (Carnivore) obj; 
       newObj.doCarnivoreWork(); 
      } 
      else if(obj instanceof Food){ 
       Food newObj = (Food) obj; 
       newObj.doFoodWork(); 
      } 
      else if(obj instanceof Drink){ 
       Drink newObj = (Drink) obj; 
       newObj.doDrinkWork(); 
      } 
     } 
    } 

    public static void main(String[] args){ 
     new Test().doTest(); 
    } 
} 

В do<class>Word методы содержат только оператор печати, как это делают getCoordinates методы. Выходной сигнал запуска выше:

Getting Food Coordinates... 
Working on Foods. 
Getting Drink Coordinates... 
Working on Drinks. 
Getting Herbivore Coordinates... 
Working on Herbivores. 
Getting Carnivore Coordinates... 
Working on Carnivores. 

Update: Вот определение интерфейса:

public interface MyActiveObject{ 
    public Coordinates getCoordinates(); 
} 

Классы Entity и MyObjects пустуют. Drink и Food продлить MyObjects:

public class Drink extends MyObjects implements MyActiveObject{ 
    @Override 
    public Coordinates getCoordinates(){ 
     System.out.println("Getting Drink Coordinates..."); 
     return new Coordinates(); 
    } 
    public void doDrinkWork(){ 
     System.out.println("Working on Drinks."); 
    } 
} 

Carnivore и Herbivore продлить Entity:

public class Carnivore extends Entity implements MyActiveObject{ 
    @Override 
    public Coordinates getCoordinates(){ 
     System.out.println("Getting Carnivore Coordinates..."); 
     return new Coordinates(); 
    } 
    public void doCarnivoreWork(){ 
     System.out.println("Working on Carnivores."); 
    } 
} 

Обновление второй: Я думаю, что я вижу проблему. Интерфейс, который вы используете, содержит много сигнатур методов, которые не нужны в ваших классах. Это оно?

В этом случае просто создайте пустой интерфейс маркера только для возможности размещения различных классов в массиве.

public interface Arrayable{}; 
+0

Я не уверен, что это решит проблему, шаблон завод использует интерфейс для того, чтобы работать, который означает, что я должен наследовать все методы, единственный способ обойти это я нашел, чтобы использовать абстрактную модель фабрики разделить интерфейсы и разделить разные объекты в свои собственные списки (не то, что я хотел сделать), но я не могу найти способ преодолеть эту проблему, спасибо за ваш пост, хотя всегда ценю помощь :-) –

+0

Если ваша проблема заключается в том, что интерфейс, который вы используете, имеет сигнатуры методов, которые не нужны в классах, а затем см. мое второе обновление. Если это не проблема, я затрудняюсь понять природу вашего вопроса. В таком случае вы могли бы привести более подробный пример проблемы? – TommCatt

Смежные вопросы