#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. Ты мог бы это сделать. Но этот способ позволяет настроить его при желании.