added abstract factory module