type, abstract :: AbstractMeterFactory contains procedure(i_make_meter), deferred :: make_meter end type AbstractMeterFactory