Хорошо, вы хотите разорвать прямую связь между сигналом тревоги и датчиком.
В ваших предложенных решениях показаны два конструктора, один из которых вводит объект датчика (созданный извне), а другой - создание объекта датчика напрямую.Вы должны сбросить:
public Alarm() {
this.sensor = new Sensor();
}
, потому что это не нужно и потому, что оно продлевает ту жесткую связь, которую вы пытаетесь избежать с помощью SOLID.Делая это, вы не нарушаете зависимость.
В общем, наиболее распространенные варианты создания зависимостей:Зависимые объекты создаются:
1) Непосредственно клиентским объектом (тесная связь)
2) Косвенным образом клиент использует фабричные методы клиента
3) Косвенным образом Клиент использует Abstract Factory объект, введенный в Клиент (фабричный ввод - DI).Вы можете вводить различные фабрики.
4) Внешне вручную и вводить в клиент (DI)
5) Внешне через контейнер DI и вводить в клиент (DI)
Ключевым моментом DI является то, что Клиент не контролирует, как создаются его иждивенцы.Это объясняет термин " инверсия управления ".
Однако клиент сохраняет управление с помощью " Factory Method ", " Abstract Factory «.
Контейнеры DI стали в последние годы чрезвычайно популярными, особенно в современных каркасах.