Способ отображения определенных видов пиццы из списка на Java

#java #list #maps #factory-pattern

Вопрос:

У меня есть простая программа для пиццы на Java, сделанная по заводскому шаблону. В принципе, когда фабрика задается в качестве параметра, она создает конкретную пиццу, которая затем добавляется в список пиццерий пиццерии.

Я хотел бы создать метод, который отображает, сколько у меня конкретных пицц. Например, когда вызывается метод, я хотел бы, чтобы он отображал что-то вроде «У нас есть 5 пиццачикаго и 3 пиццаневыорка». Я не знаю, как это сделать.

Это мой код.

 public interface Pizza {
    String name();
}

public class PizzaChicago implements Pizza{
    public Integer price;
    public PizzaChicago(Integer price){
        this.price = price;
    }

    @Override
    public String name() {
        return this.getClass().getSimpleName();
    }
}

public class PizzaNewYork implements Pizza{
    public Integer price;
    public PizzaNewYork(Integer price){
        this.price = price;
    }
    @Override
    public String name() {
        return this.getClass().getSimpleName();
    }
}


public interface PizzaFactory {
   public Pizza createPizza(Integer price);
}

public class PizzaNewYorkFactory implements PizzaFactory{
    @Override
    public Pizza createPizza(Integer price) {
        return new PizzaNewYork(6);
    }
}

public class PizzaChicagoFactory implements PizzaFactory{
    @Override
    public Pizza createPizza(Integer price) {
        return new PizzaChicago(8);
    }
}

import java.util.ArrayList;
import java.util.List;

public class PizzaShop {
    List<Pizza> pizzaList = new ArrayList<>();
    public void createPizza(PizzaFactory factory, Integer price){
        Pizza pizza = factory.createPizza(price);
       System.out.println(pizza.name()   " "   "was created");
        pizzaList.add(pizza);
    }

}
`
 

Комментарии:

1. Пицца, которая у вас есть , означает, сколько пицц хранится в вашей pizzaList ? Вы можете использовать stream.grouping по имени пиццы и построить выходную строку из карты.

2. Да, в основном, например, сколько «Пиццачикаго» и сколько «Пиццаневорк» у меня в моем пиццалисте

3.Я бы вообще не рекомендовал использовать instanceof для определения количества каждого Pizza типа, как предполагает ваш принятый ответ. Если эта информация имеет отношение к делу, вам следует обращаться с ними как с таковыми. Либо создайте отдельные счетные переменные для увеличения для каждого созданного типа, либо сохраните их в отдельных List коллекциях, специфичных для их типа, чтобы вы могли использовать size() функцию.

Ответ №1:

Все, что вам нужно сделать, это повторить список и проверить, каков тип каждого объекта.

 int countPizzaNewYork = 0, countPizzaChicago = 0; 
for(Pizza p: pizzaList){
    if(p instanceOf PizzaNewYork)
    {
     countPizzaNewYork  ;
    }
    else
    {
     countPizzaChicago  ;
    }

 }
System.out.println("We have "  countPizzaChicago " PizzaChicago and " countPizzaNewYork " PizzaNewYork");
 

Комментарии:

1. Не очень хороший подход. Что делать, если вам нужно добавить новую пиццу?

Ответ №2:

Альтернативный подход (используйте карту вместо списка):

 public class PizzaShop {
    Map<String, Integer> pizzaDiary = new HashMap<>();

    public void createPizza(PizzaFactory factory, Integer price) {
        Pizza pizza = factory.createPizza(price);
        System.out.println(pizza.name()   " "   "was created");
        int previousCount = pizzaDiary.getOrDefault(pizza.name(), 0);
        pizzaDiary.put(pizza.name(), previousCount   1);
    }
}
 

Используйте pizzaDiary карту, чтобы распечатать количество вашей пиццы.

Ответ №3:

Наличие отдельного класса для каждой пиццы может быть проблематичным и несколько громоздким. И наверняка использовать class name » и instanceof » — это не тот путь, по которому нужно идти. Вы рассматривали возможность использования перечисления для представления пиццы? Вот пример того, как это может работать.

 public class PizzaShopDemo {
    
    enum Pizza {
        CHICAGOPIZZA(8, "Chicago Pizza"),
        NEWYORKPIZZA(6, "New York Pizza");
        
        private double price;
        private String name;
        private int count = 0;
        
        private Pizza(double price, String name) {
            this.price = price;
            this.name = name;
        }
        
        public double getPrice() {
            return price;
        }
        
        public String getName() {
            return name;
        }
        
        public void update() {
            count  ;
        }
        
        public int getCount() {
            return count;
        }
    }
    
    public static void main(String[] args) {
        
        new PizzaShopDemo().pizzaShop();
    }
    
    public void pizzaShop() {
        createPizza(Pizza.CHICAGOPIZZA);
        createPizza(Pizza.NEWYORKPIZZA);
        createPizza(Pizza.CHICAGOPIZZA);
        createPizza(Pizza.NEWYORKPIZZA);
        createPizza(Pizza.CHICAGOPIZZA);
        createPizza(Pizza.CHICAGOPIZZA);
        createPizza(Pizza.NEWYORKPIZZA);
        
        for (Pizza p : Pizza.values()) {
            System.out.println(p.getName()   ", "   p.getPrice()
                      ", "   p.getCount());
        }
        
    }
    
    public void createPizza(Pizza type) {
        type.update();
        // other stuff here.
    }
}
 

С принтами

 Chicago Pizza, 8.0, 4
New York Pizza, 6.0, 3
 

Комментарии:

1. Почему бы просто не использовать название самой пиццы, чтобы распечатать ее?

2. Ты мог бы это сделать. Но этот способ позволяет настроить его при желании.