при кодировании тренировки Я думал, что я использую абстрактный шаблон фабрики, но, как оказалось, я, похоже, реализовал абстрактный шаблон класса (по словам парня, который просмотрел мой код).Изменение 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
я вижу. По крайней мере, я был не совсем на неправильном пути. Таким образом, завод буквально просто строит мои объекты и всегда нуждается в абстрактной базовой схеме и конкретных типах, расширяющих базу? – daZza
В значительной степени. Кроме того, вы можете покончить с абстрактной базой и вместо этого использовать интерфейс. – mikea
Выполнено ваше предложение, и приложение все еще работает, поэтому большое вам спасибо :) Использование AbstractMachineBase newMachine = MachineFactory.createMachine (type, machineID, false); теперь для создания машин в моем классе контроллера. У вас нет опыта работы с Spring + Hibernate, не так ли? :) – daZza