Started out on the abstract factory pattern. Incomplete.