Middle
Folosiți modele de proiectare în practica dvs.?
sobes.tech AI
Răspuns de la AI
Da, le folosesc. Ele ajută la rezolvarea sarcinilor tipice, la îmbunătățirea structurii codului, lizibilității și întreținerii.
Modelele principale pe care le aplic sunt:
- Creational:
- Singleton: Pentru a limita clasa la o singură instanță.
- Factory Method: Pentru a crea obiecte fără a specifica clasa concretă.
- Abstract Factory: Pentru a crea familii de obiecte legate.
- Builder: Pentru a crea obiecte complexe pas cu pas.
- Structurale:
- Adapter: Pentru compatibilitatea interfețelor.
- Decorator: Pentru adăugarea dinamică a comportamentului unui obiect.
- Facade: Pentru a oferi o interfață unificată unui subsistem.
- Proxy: Pentru a controla accesul la un obiect.
- Comportamentale:
- Observer: Pentru implementarea unui mecanism de abonare și notificare.
- Strategy: Pentru a defini o familie de algoritmi și a-i face interschimbabili.
- Template Method: Pentru a defini scheletul unui algoritm într-o clasă de bază.
- Command: Pentru a încapsula o solicitare ca obiect.
De exemplu, folosesc adesea Singleton pentru lucrul cu baze de date:
<?php
// Database.php
class Database {
private static ?Database $instance = null;
private ?PDO $pdo = null;
private function __construct() {
// Configurarea conexiunii la BD
$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 pot folosi Factory Method pentru a crea diferite tipuri de mesaje sau obiecte în funcție de datele de intrare:
<?php
// MessageFactory.php
interface Message {
public function send(): string;
}
class EmailMessage implements Message {
public function send(): string {
return "Trimitere email...";
}
}
class SmsMessage implements Message {
public function send(): string {
return "Trimitere 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("Tip de mesaj necunoscut.");
}
}
}
// Utilizare:
// $factory = new MessageFactory();
// $email = $factory->createMessage('email');
// echo $email->send(); // Va afișa "Trimitere email..."
Alegerea modelului depinde de sarcina specifică și de context. Esențial este să nu le folosești doar pentru că le cunoști, ci să înțelegi când sunt cu adevărat necesare pentru a îmbunătăți codul.