Цель - отделить контракт (интерфейс, с которым вы работаете) от реализации (класс, реализующий этот интерфейс).
Предположим, вы хотите реализовать Resal Randomizing DAL (просто так). При выборе варианта 1 вам нужно либо наследовать от DAL, либо изменить все места, где используется DAL.
Наследование проблематично: реализация DAL может быть закрыта, вам может потребоваться наследование от чего-то другого и т. Д.
Во втором случае вы делаете свой класс автономным и просто изменяете экземпляр:
IUserDAL dal;
if (AprilFirst)
dal = new ReasultRandomizingUserDAL();
else
dal = new UserDAL();
Объект, экземпляр которого создан, идентичен.