add abstract factory method