abstract-factory pattern add