added abstract factory
updated index