2014-02-06 3 views
0

при кодировании тренировки Я думал, что я использую абстрактный шаблон фабрики, но, как оказалось, я, похоже, реализовал абстрактный шаблон класса (по словам парня, который просмотрел мой код).Изменение abstractClass для abstractFactory шаблон. Где разница?

Я реализовал свою предполагаемую «фабрику», используя объяснения, которые я нашел в Интернете, и диаграмму UML. Я только что изучил их и сравнил с моим кодом, но до сих пор не вижу ошибки и причины, почему это должен быть только абстрактный шаблон класса.

Как показано на диаграмме UML, я обнаружил, что я реализовал единый абстрактный класс AbstractMachineFactory, который определяет все необходимые атрибуты и методы для моих конкретных машин. Они отличаются только производимым продуктом.

Затем я реализовал три разных класса ConcreteMachineType, которые расширяют AbstractMachineFactory, также точно так же, как показано в диаграмме UML.

Вот мой код:

Фабрика:

public abstract class abstractMachineFactory { 

public final int  machineID; 
public int   producedGoods; 
public boolean  status; 

private final Logger abstractMachineFactoryLogger = LoggerFactory.getLogger(abstractMachineFactory.class); 

public abstractMachineFactory(final int ID, final boolean state) { 
    this.machineID = ID; 
    this.status = state; 
} 

public Integer getMachineID() { 
    return this.machineID; 
} 

public Integer getNumberOfProducedGoods() { 
    return this.producedGoods; 
} 

public Boolean getStatus() { 
    return this.status; 
} 

public void startUp() { 
    this.status = true; 
} 

public void shutDown() { 
    this.status = false; 
} 

public abstract void produceGoods(); 

} 

Одним из конкретных машин:

public class concreteMachineType1 extends abstractMachineFactory { 

private final Logger concreteMachineType1Logger = LoggerFactory.getLogger(concreteMachineType1.class); 

public concreteMachineType1(final int ID, final boolean state) { 
    super(ID, state); 
} 

@Override 
public void produceGoods() { 

    machineController machineController = exercise.java.basics.machine.machineController.getInstance(); 

    int timeToProduce = (int) ((Math.random() * (6 - 1)) + 1) * 1000; 


    try { 
     Thread.sleep(timeToProduce); 
    } catch (InterruptedException ex) { 
     Thread.currentThread().interrupt(); 
    } 

    machineController.moveNailToStorage(); 

    this.producedGoods++; 

} 

} 

Я создаю новые машины с помощью класса контроллера, который обрабатывает все действия в отношении машины. Все созданные машины хранятся в ArrayList, чтобы получить доступ к ним позже в классе контроллера. Вот небольшой отрывок из этого класса относительно создания новой машины:

public void createMachine(final MachineType type) { 

    int machineID; 
    if (MachineType.TYPE1.equals(type)) { 

     machineID = this.arrType1.size() + 1; 
     abstractMachineFactory newMachine = new concreteMachineType1(machineID, false); 
     this.numberOfType1++; 
     this.arrType1.add(newMachine); 

    } else if (MachineType.TYPE2.equals(type)) { 

     machineID = this.arrType2.size() + 1; 
     abstractMachineFactory newMachine = new concreteMachineType2(machineID, false); 
     this.numberOfType2++; 
     this.arrType2.add(newMachine); 

    } 

    else if (MachineType.TYPE3.equals(type)) { 

     machineID = this.arrType3.size() + 1; 
     abstractMachineFactory newMachine = new concreteMachineType3(machineID, false); 
     this.numberOfType3++; 
     this.arrType3.add(newMachine); 

    } 
} 

наилучшими пожеланиями daZza

ответ

3

Узор завод использует фабрику для возврата объектов базового типа.

Я ожидал, что он ожидал, что-то вроде этого:

public abstract class AbstractBase() {} 

public class Concrete1 extends AbstractBase() {} 

public class Concrete2 extends AbstractBase() {} 

public class Factory() { 
    enum BaseType { 
     Type1, 
     Type2 
    }; 

    public static AbstractBase getObject(BaseType baseType) { 
     if (baseType == Type1) { 
      return new Concrete1(); 
     } else if (baseType == Type2) { 
      return new Concrete2(); 
     } 
     throw new IllegalArgumentException(); 
    } 
} 
+0

я вижу. По крайней мере, я был не совсем на неправильном пути. Таким образом, завод буквально просто строит мои объекты и всегда нуждается в абстрактной базовой схеме и конкретных типах, расширяющих базу? – daZza

+0

В значительной степени. Кроме того, вы можете покончить с абстрактной базой и вместо этого использовать интерфейс. – mikea

+0

Выполнено ваше предложение, и приложение все еще работает, поэтому большое вам спасибо :) Использование AbstractMachineBase newMachine = MachineFactory.createMachine (type, machineID, false); теперь для создания машин в моем классе контроллера. У вас нет опыта работы с Spring + Hibernate, не так ли? :) – daZza

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