abstract factory classes