simple factory & factory method & abstract factory