Amazon - Online Shopping System
Amazon (amazon.com) is the world’s largest online retailer. The company was originally a bookseller but has expanded to sell a wide variety of consumer goods and digital media. For the sake of this problem, we will focus on their online retail business where users can sell/buy their products.
Features
We will be designing a system with the following requirements:
- Users should be able to add new products to sell.
- Users should be able to search for products by their name or category.
- Users can search and view all the products, but they will have to become a registered member to buy a product.
- Users should be able to add/remove/modify product items in their shopping cart.
- Users can check out and buy items in the shopping cart.
- Users can rate and add a review for a product.
- The user should be able to specify a shipping address where their order will be delivered.
- Users can cancel an order if it has not shipped.
- Users should get notifications whenever there is a change in the order or shipping status.
- Users should be able to pay through credit cards or electronic bank transfer.
- Users should be able to track their shipment to see the current state of their order.
Rough Solution (LLD-Machine Coding)
Basic Entity
- Admin: Mainly responsible for account management and adding or modifying new product categories.
- Guest: All guests can search the catalog, add/remove items to the shopping cart, as well as become registered members.
- Member: Members can perform all the activities that guests can, in addition to which, they can place orders and add new products to sell.
- System: Mainly responsible for sending notifications for orders and shipping updates.
Final Code
public class Address {
private String streetAddress;
private String city;
private String state;
private String zipCode;
private String country;
}
public enum OrderStatus {
UNSHIPPED, PENDING, SHIPPED, COMPLETED, CANCELED, REFUND_APPLIED
}
public enum AccountStatus {
ACTIVE, BLOCKED, BANNED, COMPROMISED, ARCHIVED, UNKNOWN
}
public enum ShipmentStatus {
PENDING, SHIPPED, DELIVERED, ON_HOLD,
}
public enum PaymentStatus {
UNPAID, PENDING, COMPLETED, FILLED, DECLINED, CANCELLED, ABANDONED, SETTLING, SETTLED, REFUNDED
}
// For simplicity, we are not defining getter and setter functions. The reader can
// assume that all class attributes are private and accessed through their respective
// public getter methods and modified only through their public methods function.
public class Account {
private String userName;
private String password;
private AccountStatus status;
private String name;
private Address shippingAddress;
private String email;
private String phone;
private List<CreditCard> creditCards;
private List<ElectronicBankTransfer> bankAccounts;
public boolean addProduct(Product product);
public boolean addProductReview(ProductReview review);
public boolean resetPassword();
}
public abstract class Customer {
private ShoppingCart cart;
private Order order;
public ShoppingCart getShoppingCart();
public bool addItemToCart(Item item);
public bool removeItemFromCart(Item item);
}
public class Guest extends Customer {
public bool registerAccount();
}
public class Member extends Customer {
private Account account;
public OrderStatus placeOrder(Order order);
}
public class ProductCategory {
private String name;
private String description;
}
public class ProductReview {
private int rating;
private String review;
private Member reviewer;
}
public class Product {
private String productID;
private String name;
private String description;
private double price;
private ProductCategory category;
private int availableItemCount;
private Account seller;
public int getAvailableCount();
public boolean updatePrice(double newPrice);
}
public class Item {
private String productID;
private int quantity;
private double price;
public boolean updateQuantity(int quantity);
}
public class ShoppingCart {
private List<Items> items;
public boolean addItem(Item item);
public boolean removeItem(Item item);
public boolean updateItemQuantity(Item item, int quantity);
public List<Item> getItems();
public boolean checkout();
}
public class OrderLog {
private String orderNumber;
private Date creationDate;
private OrderStatus status;
}
public class Order {
private String orderNumber;
private OrderStatus status;
private Date orderDate;
private List<OrderLog> orderLog;
public boolean sendForShipment();
public boolean makePayment(Payment payment);
public boolean addOrderLog(OrderLog orderLog);
}
public class ShipmentLog {
private String shipmentNumber;
private ShipmentStatus status;
private Date creationDate;
}
public class Shipment {
private String shipmentNumber;
private Date shipmentDate;
private Date estimatedArrival;
private String shipmentMethod;
private List<ShipmentLog> shipmentLogs;
public boolean addShipmentLog(ShipmentLog shipmentLog);
}
public abstract class Notification {
private int notificationId;
private Date createdOn;
private String content;
public boolean sendNotification(Account account);
}
public interface Search {
public List<Product> searchProductsByName(String name);
public List<Product> searchProductsByCategory(String category);
}
public class Catalog implements Search {
HashMap<String, List<Product>> productNames;
HashMap<String, List<Product>> productCategories;
public List<Product> searchProductsByName(String name) {
return productNames.get(name);
}
public List<Product> searchProductsByCategory(String category) {
return productCategories.get(category);
}
}