add abstract factory, it doesn't call initializer any more