should implement abstract factory this way