Marco Reus set up Jadon Sancho for the opening goal before adding one of his own with a cool finish after the restart.
The duo combined to assist Mario Gotze and his replacement Paco Alcacer rounded off the scoring from the penalty spot in the 87th minute after Pascal Stenzel was penalised for handball.
Just a second away win in six top-flight outings for Dortmund again reduced the gap to Bayern, who edged Werder Bremen 1-0 on Saturday, to one point.
It took just 12 minutes for BVB to open the scoring. Reus played a one-two with Raphael Guerreiro before picking out Sancho to sweep home his 11th Bundesliga goal of the season at the back post.
Guerreiro and Reus combined again nine minutes after the restart, the Portugal international sending a delightful pass behind Dominique Heintz that Reus dispatched in confident fashion.
Marius Wolf tried to play on after appearing to hurt his ankle but had to be replaced by Omer Toprak in the 56th minute, giving Favre cause for concern ahead of the Revierderby against Schalke on Saturday.
Dortmund faced minimal pressure at the back and they added to their tally when Sancho led a break down the left and fed the overlapping Reus, who squared for Gotze to tuck home in the 79th minute.
12 - @MarioGoetze had a hand in 12 @BlackYellow goals this #Bundesliga season (5 goals, 7 assists), his highest tally since the 2013-14 season (10 goals, 8 assists). Reinvigorated. #SCFBVB pic.twitter.com/s4Tc1Yq9u8— OptaFranz (@OptaFranz) April 21, 2019
Gotze was immediately replaced by Alcacer and the Spaniard drilled home from 12 yards after Stenzel used his arm when attempting to clear an effort from Reus that was pushed onto the woodwork by Freiburg keeper Alexander Schwolow.