Machine & Device Design

Coffee Machine

Ingredients, Recipe Aur Concurrency
💡 Coffee machine EK CHHOTI RASOI hai — har recipe ki apni saamagri list hai, aur ek hi doodh ka dabba sab recipes share karte hain. Do log ek saath order karein to dabba khaali hone par jhagda hota hai.

Core entities: Ingredient, Recipe (ingredient → quantity ka map), Inventory, aur Machine ke N outlets. Recipe ko DATA rakho, CODE nahi — nayi coffee add karna ek map entry honi chahiye, nayi class nahi.

Asli test CONCURRENCY ka hai: N outlets ek saath ek hi inventory se ingredients uthaate hain. Ingredient check aur deduct ATOMIC hone chahiye, warna dono outlets "doodh hai" dekh lenge aur ek ko aadhi coffee milegi. Ek hi lock lo poore ingredient set par — nahi to deadlock ka risk hai.

class Inventory {
  private final Map<String, Integer> stock = new HashMap<>();

  // Poore set par EK hi lock — warna do outlets deadlock kar sakte hain
  synchronized boolean consume(Map<String, Integer> needed) {
    for (var e : needed.entrySet())
      if (stock.getOrDefault(e.getKey(), 0) < e.getValue()) return false;
    needed.forEach((k, v) -> stock.merge(k, -v, Integer::sum));
    return true;
  }
}
Coffee machine EK CHHOTI RASOI hai — har recipe ki apni saamagri list hai, aur ek hi doodh ka dabba sab recipes share karte hain. Do log ek saath order karein to dabba khaali hone par jhagda hota hai.
1 / 2
⚡ Quick Recap
  • Recipe ko data rakho (ingredient→quantity map), nayi class mat banao
  • Check aur deduct atomic — warna aadhi coffee ban jaayegi
  • Per-ingredient locks deadlock la sakte hain; single lock defend karo
Is page mein (2 subtopics)

Sabse badi galti hai har coffee ke liye alag class banana — Espresso, Latte, Cappuccino. Ye Open-Closed todta hai: nayi coffee = naya code deploy.

Sahi approach: Recipe ek DATA structure hai — naam plus ingredient→quantity ka map. Nayi coffee add karna config ya DB entry hai, code change nahi. Interviewer ko ye difference turant dikhta hai.

record Recipe(String name, Map<String, Integer> ingredients, Money price) {}

// Config se load — nayi coffee ke liye deploy nahi chahiye
Recipe latte = new Recipe("Latte",
    Map.of("coffee", 30, "milk", 150, "sugar", 10), Money.of(80));

N outlets ka matlab hai N coffee ek saath ban sakti hain — agar ingredients hain. ExecutorService with N threads natural fit hai. Har outlet inventory se atomically consume karta hai; consume fail hua to "ingredient not available" message.

Low-stock indicator bhi mention karo: koi ingredient threshold se neeche jaaye to alert. Ye chhota feature real machines mein hota hai aur socha hua design dikhata hai.

💡Tip: Agar interviewer bole "har ingredient par alag lock lo taaki parallelism badhe" — to deadlock ka scenario batao aur lock ordering (hamesha ek fixed order mein lock lo) suggest karo. Ye advanced concurrency samajh dikhata hai.