Попрощайтесь с if/else в рабочем коде.

1. Я хочу выпить колы, поэтому я

(new Myself)->getCola();

На самом деле: я иду туда один

2. Но иногда я хочу, чтобы другой меня доставал, поэтому я

(new Big)->getCola();
(new Gong)->getCola();

На самом деле: я спрашиваю их напрямую

3. Я постоянно повторяюсь, делая это, поэтому я делаю

bind('friend', random(new Big, new Gong));
// then
make('friend')->getCola();

На самом деле: я кричу: «Кто-нибудь может принести мне колу, пожалуйста?» и один из них ответит

Это МОК.

4. Выглядит лучше, но я также просто хочу как-нибудь выпить пива, тогда я позабочусь о том, чтобы они могли его купить, поэтому я так и делаю.

interface Friend {
    public function giveMoneyForBeer(int $money): self
}
// then
class Big implements Friend {...}
class Gong implements Friend {...}

Теперь я, когда хочу пива, так и делаю

make('friend')->giveMoneyForBeer(100)->getBeer();

На самом деле: я иду к кому-то, даю ему 100 и прошу пива.

5. Почти готово, я обернул эти сложности в Фасад, так что я просто делаю

Friend::getBeer(100);

Преимущества

Теперь я могу настроить своих друзей в зависимости от ситуации, настроив список

У нас вечеринка (на производстве)

bind('friend', random(new Big, new Gong, new Art, new Boss));

или я просто хочу, чтобы это было отдельно (тестирование на моем локальном компьютере)

bind('friend', new Myself);

Не касаясь производственного кода.