Шаблоны проектирования и принцип OOP в Java - PullRequest
0 голосов
/ 27 мая 2020

Вопрос, который необходимо решить:

«Существует несколько типов заказов на бухгалтерские услуги. Текущее решение для этих заказов - создать новый класс для каждого типа (на основе типа работы, например, аудита или повседневной работы). дневная работа, независимо от того, предназначен ли заказ для приоритетного клиента, и является ли заказ разовым или регулярным расписанием). Полная система имеет 66 * 2 * 2 таких классов (264 класса заказов!), из них 8 (2 * 2 * 2) предоставлен вам в качестве примера - CPA хотел бы, чтобы вы нашли способ уменьшить нагрузку на этот класс, не нарушая существующий интерфейс заказа. "

Код, связанный с вопросом:

 if (isScheduled) {
  if (1 == orderType) { 
    if (isCritical) {
      order =
          new FirstOrderTypeScheduled(
              id, clientID, date, criticalLoading, maxCountedEmployees, numQuarters);
    } else {
      order = new Order66Scheduled(id, clientID, date, maxCountedEmployees, numQuarters);
    }
  } else if (2 == orderType) { // 2 is audit
    if (isCritical) {
      order = new CriticalAuditOrderScheduled(id, clientID, date, criticalLoading, numQuarters);
    } else {
      order = new NewOrderImplScheduled(id, clientID, date, numQuarters);
    }
  } else {
    return null;
  }
} else {
  if (1 == orderType) {
    if (isCritical) {
      order = new FirstOrderType(id, clientID, date, criticalLoading, maxCountedEmployees);
    } else {
      order = new Order66(id, clientID, date, maxCountedEmployees);
    }
  } else if (2 == orderType) {
    if (isCritical) {
      order = new CriticalAuditOrder(id, clientID, date, criticalLoading);
    } else {
      order = new NewOrderImpl(id, clientID, date);
    }
  } else {
    return null;
  }
}

Итак, дано несколько типов классов (8 классов), которые указаны в вопросе выше. Я хочу спросить, среди принципов проектирования и принципов объектно-ориентированного проектирования (SOLID), есть ли метод, который мне следует применить для решения вышеуказанного вопроса? (Я подумываю использовать Bridge Pattern)

Заранее спасибо!

1 Ответ

1 голос
/ 27 мая 2020

Шаблоны творческого проектирования, которые могут вам помочь, - это Factory и Builder.

Если у вас есть интерфейс (скажем, IOrder) и несколько реализаций, вы можете использовать шаблон factory:

у вас будет класс OrderFactory, который будет создавать заказы на основе некоторых параметров, это может быть что-то вроде этого:

public class OrderFactory {

   public IOrder createOrder( boolean isScheduled, int orderType, boolean isCritical){
      // here will be the logic from your post and the order will be returned
   }

}

с шаблоном Factory, вы также можете иметь несколько вложенных фабрик, которые, я думаю, могут быть case в вашем примере - это называется абстрактной фабрикой. Это более сложно, вы можете проверить пример здесь: https://www.geeksforgeeks.org/abstract-factory-pattern/

...