factory method and abstract factory