25-Comp-B11 Advanced Software Design · May 2016
Nivaar worked solution (AI-drafted; not reviewed by a licensed engineer)
Question text not reproduced: the examination questions are © Engineers and Geoscientists BC. Open the official past paper (linked at the top of this page) to read the question, then follow the worked solution below.
Creational patterns are concerned with the PROCESS OF OBJECT CREATION itself — abstracting away how, when, and which concrete class gets instantiated, so client code that needs an object does not depend on the concrete instantiation logic (Singleton, Factory Method, Abstract Factory, Builder, Prototype). Their defining concern is CONTROLLING instantiation.
Structural patterns are concerned with how classes and objects are COMPOSED into larger structures — simple, static ways of assembling objects while keeping the resulting structure flexible and efficient (Adapter, Bridge, Composite, Decorator, Façade, Proxy). Their defining "shape" is a static COMPOSITION relationship between the participant classes.
Behavioural patterns are concerned with algorithms and the assignment of RESPONSIBILITY / communication between objects — how objects interact and distribute work at runtime (Strategy, Observer, Command, Template Method, State, Iterator). Their defining "shape" is a runtime PROTOCOL of collaboration.
Creational example — Singleton, classified creational. Singleton's entire contribution is controlling instantiation: it ensures a class has exactly one instance and provides a single global access point to it, typically by making the constructor private and exposing a static getInstance() that creates the sole instance on first call and returns it thereafter. It says nothing about how objects are composed into a structure, nor about a runtime communication protocol between multiple collaborating objects — its whole purpose begins and ends at the moment of (controlled, single) instantiation, which is exactly the creational concern.
Structural example — Proxy (Question 14), classified structural. Proxy's core contribution is a static composition: a surrogate object implementing the same interface as its real subject, so the client's held reference can transparently be either one. This is a WIRING decision made once, at object-assembly time, about how two objects (proxy and real subject) are structurally related through a shared interface — it does not, by itself, define any object-creation policy (creational) nor a multi-object runtime notification/algorithm protocol (behavioural).
Behavioural example — Observer (Question 16), classified behavioural. Observer's core contribution is a runtime PROTOCOL of collaboration: a subject notifies an open-ended set of registered observers whenever its state changes, and each observer decides for itself how to react. The pattern is entirely about the assignment of responsibility and the sequencing of communication AT RUNTIME (who gets told what, and when) — it says nothing about how the subject or observers were created (creational), nor is it a static compositional wiring of exactly two fixed roles the way Proxy is.