Apply object-oriented design patterns to model a fully functional chess game engine, covering piece behaviour, move validation, game state, and extensibility.
Design the Piece abstract class and concrete subclasses (King, Queen, Rook, Bishop, Knight, Pawn). Each piece exposes getPseudoLegalMoves(board): Move[]. Apply polymorphism so the game engine calls pieces uniformly. Define Position as a value object.