added abstract channel and channel factory