Middle
Използвате ли шаблони за дизайн в практиката си?
sobes.tech AI
Отговор от AI
Да, използвам ги. Те помагат за решаване на типични задачи, подобряване на структурата на кода, неговата четливост и поддържане.
Основните шаблони, които прилагам:
- Производствени:
- Singleton: За ограничаване на класа до един екземпляр.
- Factory Method: За създаване на обекти без да се указва конкретен клас.
- Abstract Factory: За създаване на свързани семейства обекти.
- Builder: За стъпково създаване на сложни обекти.
- Структурни:
- Adapter: За съвместимост на интерфейсите.
- Decorator: За динамично добавяне на поведение към обект.
- Facade: За предоставяне на единен интерфейс към подсистема.
- Proxy: За управление на достъпа до обект.
- Поведенчески:
- Observer: За реализиране на механизъм за абонамент и известяване.
- Strategy: За определяне на семейство алгоритми и тяхната взаимозаменяемост.
- Template Method: За определяне на скелета на алгоритъм в базовия клас.
- Command: За инкапсулиране на заявка като обект.
Например, често използвам Singleton за работа с база данни:
<?php
// Database.php
class Database {
private static ?Database $instance = null;
private ?PDO $pdo = null;
private function __construct() {
// Конфигурация на връзката с БД
$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() {}
}
Мога също да използвам Factory Method за създаване на различни типове съобщения или обекти в зависимост от входните данни.
<?php
// MessageFactory.php
interface Message {
public function send(): string;
}
class EmailMessage implements Message {
public function send(): string {
return "Sending email...";
}
}
class SmsMessage implements Message {
public function send(): string {
return "Sending 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("Unknown message type.");
}
}
}
// Използване:
// $factory = new MessageFactory();
// $email = $factory->createMessage('email');
// echo $email->send(); // Ще изведе "Sending email..."
Изборът на шаблон зависи от конкретната задача и контекста. Важното е да не ги използвате просто заради използването им, а да разбирате кога наистина са необходими за подобряване на кода.