Seems PrefixSpan even takes different input: Array[Array[T]] vs FPGrowth: Array[T]. So it may be tricky to unify.
However we do have the case where e.g. QuantileDiscretizer returns a Bucketizer as Model from fit. In that case Bucketizer can be instantiated directly and independently, but it could in theory be the case that some other estimator returns a Bucketizer as its model.
So we could perhaps think about both FPGrowth and PrefixSpan returning an AssociationRuleModel from fit. It could work if the input can be generalized to Seq[T] where for FPGrowth it would be Seq[Item] and for PrefixSpan it would be Seq[Seq[Item]]. The output of transform for the model would be the predicted items as above. It would expose getFreqItems and getAssociationRules both returning a DataFrame.
Is there something in the nature of PrefixSpan vs FPGrowth that makes this too difficult? (I'll have to go read the papers when I get some time!)
But having said that it could be pretty complex to try to support this. If so, unless there's a compelling argument I'd go for Joseph K. Bradley's suggestion above, and hide the association rule class for now (can expose later as needed). Then PrefixSpan will be totally independent and return its own PrefixSpanModel (that may also expose a transform method that has similar semantics but different internals).