add abstract Factory