Solution (source code)

= Solution

Introduce one shared `GymStandings` <singleton object>. It stores the latest current-performance score for every participating `GymEquipment`, using the equipment reference as key, and returns every equipment object tied for the maximum score. `Performance.update` sends each freshly computed score to this object. The previous <observer pattern> and its prediction observer remain in use.

\Image[/past-exam-of-the-year-1-of-the-computer-science-course-of-the-university-of-oxford/2016/imperative-main-gym-singleton.png]
{title=Observer system extended with a singleton for gym-wide standings}

The added `Performance -> GymStandings` dependency means “reports to,” while `GymStandings -> GymEquipment` represents the equipment keys in its stored score <map>. `GymStandings` is an <software object>, so clients share its unique instance instead of constructing one standings object per machine. \b[The <singleton pattern> centralizes the current scores and the maximum-score query.] Equipment objects, rather than user names, are the keys because two users can have the same name. Scores are current readings, not an accumulation of all historical notifications; the largest reported score wins, with all ties retained.