simple factory
abstract factory method