ADD: abstract factory pattern classes