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.