Accueil / Tutoriels / Prototype
Prototype
Publié le 24 Mars 2025Prototype est un design pattern de création qui permet de cloner des objets existants au lieu d’en créer de nouveaux à partir de zéro. C’est un pattern très utile surtout si la création de nouveaux objets est gourmand en ressources.
Principe
Exemples d’utilisations
Création dynamique d’éléments pour une interface utilisateur
Charger une configuration
Points d’attentions
Implémenter un prototype
Voici un exemple en Go :
package email
import "fmt"
// Interface Prototype
type EmailTemplate interface {
Clone() EmailTemplate
Customize(subject, body string)
GetContent() string
}
// Struct qui implémente le Prototype
type BasicEmail struct {
Subject string
Body string
}
func (e *BasicEmail) Clone() EmailTemplate {
return &BasicEmail{
Subject: e.Subject,
Body: e.Body,
}
}
func (e *BasicEmail) Customize(subject, body string) {
e.Subject = subject
e.Body = body
}
func (e *BasicEmail) GetContent() string {
return fmt.Sprintf("Subject: %s\nBody: %s", e.Subject, e.Body)
}
package main
import (
"fmt"
"training.go/designpatterns/prototype/email"
)
func main() {
// Prototype d'email générique
baseEmail := &email.BasicEmail{
Subject: "Bienvenue sur notre site",
Body: "Merci de vous être inscrit. Profitez de nos services !",
}
// Clonage et personnalisation pour un utilisateur spécifique
userEmail := baseEmail.Clone()
userEmail.Customize("Bienvenue Toto !", "Toto, merci de vous être inscrite. Voici votre guide de démarrage.")
fmt.Println(userEmail.GetContent())
}
Le même exemple en PHP :
namespace Practice\DesignPatterns\Prototype;
interface EmailTemplateInterface {
public function clone(): EmailTemplateInterface;
public function customize(string $subject, string $body): void;
public function getContent(): string;
}
namespace Practice\DesignPatterns\Prototype;
class BasicEmail implements EmailTemplateInterface
{
private string $subject;
private string $body;
public function __construct(string $subject, string $body)
{
$this->subject = $subject;
$this->body = $body;
}
public function clone(): EmailTemplateInterface
{
return new BasicEmail($this->subject, $this->body);
}
public function customize(string $subject, string $body): void
{
$this->subject = $subject;
$this->body = $body;
}
public function getContent(): string
{
return "Subject: {$this->subject}\nBody: {$this->body}";
}
}
declare(strict_types=1);
use Practice\DesignPatterns\Prototype\BasicEmail;
require "./vendor/autoload.php";
// Prototype d'email générique
$baseEmail = new BasicEmail("Bienvenue sur notre site", "Merci de vous être inscrit. Profitez de nos services !");
// Clonage et personnalisation pour un utilisateur spécifique
$userEmail = $baseEmail->clone();
$userEmail->customize("Bienvenue Toto !", "Toto, merci de vous être inscrite. Voici votre guide de démarrage.");
echo $userEmail->getContent();