Design Splitwise
| Difficulty: Hard | Source: awesome-low-level-design |
Requirements
- Create accounts, manage profiles
- Create groups, add users
- Add expenses with amount, description, participants
- Auto-split expenses by share
- View balances, settle up
- Different split methods: equal, percentage, exact
- View transaction history
- Handle concurrent transactions
Class Diagram

Classes, Interfaces and Enumerations
| Class/Interface | Description |
|---|---|
| User | Id, name, email, balance map with other users |
| Group | Member list, expense list |
| Expense | Id, amount, description, paying user, splits list |
| Split | Abstract class; EqualSplit, PercentSplit, ExactSplit subclasses |
| EqualSplit | Splits expense equally among all participants |
| PercentSplit | Splits expense by percentage for each participant |
| ExactSplit | Splits expense by exact amounts for each participant |
| Transaction | Id, sender, receiver, amount |
| SplitwiseService | Singleton; ConcurrentHashMap + CopyOnWriteArrayList |
Design Patterns Used
| Pattern | Application |
|---|---|
| Singleton | SplitwiseService provides centralized management of users, groups, and expenses |
| Inheritance/Polymorphism | Split hierarchy allows flexible expense splitting strategies (equal, percentage, exact) through a common abstract interface |
Code Implementations
| Language | Source Code |
|---|---|
| Java | View on GitHub |
| Python | View on GitHub |
| C++ | View on GitHub |
| C# | View on GitHub |
| Go | View on GitHub |