sample abstract factory pattern finished