Sobes.tech
Middle

Czy używasz wzorców projektowych w swojej praktyce?

sobes.tech AI

Odpowiedź od AI

Tak, używam ich. Pomagają rozwiązać typowe zadania, poprawić strukturę kodu, jego czytelność i utrzymanie.

Główne wzorce, które stosuję:

  • Twórcze:
    • Singleton: Aby ograniczyć klasę do jednej instancji.
    • Factory Method: Do tworzenia obiektów bez określenia konkretnej klasy.
    • Abstract Factory: Do tworzenia powiązanych rodzin obiektów.
    • Builder: Do krokowego tworzenia złożonych obiektów.
  • Strukturalne:
    • Adapter: Dla kompatybilności interfejsów.
    • Decorator: Do dynamicznego dodawania zachowania do obiektu.
    • Facade: Do zapewnienia zunifikowanego interfejsu do podsystemu.
    • Proxy: Do zarządzania dostępem do obiektu.
  • Behawioralne:
    • Observer: Do implementacji mechanizmu subskrypcji i powiadomień.
    • Strategy: Do definiowania rodziny algorytmów i ich wymienności.
    • Template Method: Do określenia szkieletu algorytmu w klasie bazowej.
    • Command: Do enkapsulacji żądania jako obiektu.

Na przykład często używam Singleton do pracy z bazą danych:

<?php
// Database.php
class Database {
    private static ?Database $instance = null;
    private ?PDO $pdo = null;

    private function __construct() {
        // Konfiguracja połączenia z bazą
        $dsn = 'mysql:host=localhost;dbname=mydatabase;charset=utf8';
        $user = 'myuser';
        $password = 'mypassword';

        try {
            $this->pdo = new PDO($dsn, $user, $password);
            $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (\PDOException $e) {
            throw new \PDOException($e->getMessage(), (int)$e->getCode());
        }
    }

    public static function getInstance(): self {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    public function getConnection(): ?PDO {
        return $this->pdo;
    }

    private function __clone() {}
    public function __wakeup() {}
}

I mogę używać Factory Method do tworzenia różnych typów wiadomości lub obiektów w zależności od danych wejściowych:

<?php
// MessageFactory.php
interface Message {
    public function send(): string;
}

class EmailMessage implements Message {
    public function send(): string {
        return "Wysyłanie email...";
    }
}

class SmsMessage implements Message {
    public function send(): string {
        return "Wysyłanie SMS...";
    }
}

class MessageFactory {
    public function createMessage(string $type): Message {
        switch ($type) {
            case 'email':
                return new EmailMessage();
            case 'sms':
                return new SmsMessage();
            default:
                throw new InvalidArgumentException("Nieznany typ wiadomości.");
        }
    }
}

// Użycie:
// $factory = new MessageFactory();
// $email = $factory->createMessage('email');
// echo $email->send(); // Wyświetli "Wysyłanie email..."

Wybór wzorca zależy od konkretnego zadania i kontekstu. Ważne jest, aby nie używać ich tylko dla samego używania, ale rozumieć, kiedy są naprawdę potrzebne do ulepszenia kodu.