Accueil / Tutoriels / Abstract Factory
Abstract Factory
Publié le 23 Mai 2025Abstract Factory est un pattern de création dont le rôle est de fournir une interface pour créer des familles d’objets liés entre eux sans spécifier leurs classes concrètes.
Principe
Exemples d’utilisations
Génération d’éléments HTML selon le thème
Intégration de services tiers selon l’environnement
Points d’attentions
Implémenter une Abstract Factory
Voici un exemple en Go
package component
type Button interface {
Render() string
}
type Input interface {
Render() string
}
type LightButton struct{}
func (b LightButton) Render() string {
return ``
}
type LightInput struct{}
func (i LightInput) Render() string {
return ``
}
type DarkButton struct{}
func (b DarkButton) Render() string {
return ``
}
type DarkInput struct{}
func (i DarkInput) Render() string {
return ``
}
package component
type UIFactory interface {
CreateButton() Button
CreateInput() Input
}
type LightFactory struct{}
func (f LightFactory) CreateButton() Button {
return LightButton{}
}
func (f LightFactory) CreateInput() Input {
return LightInput{}
}
type DarkFactory struct{}
func (f DarkFactory) CreateButton() Button {
return DarkButton{}
}
func (f DarkFactory) CreateInput() Input {
return DarkInput{}
}
package main
import (
"fmt"
"designpatterns/abstract-factory/component"
)
func main() {
var factory component.UIFactory
// Choix du thème selon un paramètre fictif
theme := "dark" // ou "light"
if theme == "light" {
factory = component.LightFactory{}
} else {
factory = component.DarkFactory{}
}
html := RenderPage(factory)
fmt.Println("HTML généré :\n", html)
}
func RenderPage(factory component.UIFactory) string {
button := factory.CreateButton()
input := factory.CreateInput()
return button.Render() + input.Render()
}
Le même exemple en PHP
namespace Practice\DesignPatterns\AbstractFactory;
interface ButtonInterface
{
public function render(): string;
}
namespace Practice\DesignPatterns\AbstractFactory;
interface InputInterface
{
public function render(): string;
}
namespace Practice\designPatterns\abstractFactory;
class DarkButton implements ButtonInterface
{
public function render(): string {
return '';
}
}
namespace Practice\DesignPatterns\AbstractFactory;
class DarkInput implements InputInterface
{
public function render(): string {
return '';
}
}
namespace Practice\DesignPatterns\AbstractFactory;
class LightButton implements ButtonInterface
{
public function render(): string
{
return '';
}
}
namespace Practice\DesignPatterns\AbstractFactory;
class LightInput implements InputInterface
{
public function render(): string {
return '';
}
}
namespace Practice\DesignPatterns\AbstractFactory;
interface UIFactoryInterface
{
public function createButton(): ButtonInterface;
public function createInput(): InputInterface;
}
namespace Practice\DesignPatterns\AbstractFactory;
class DarkFactory implements UIFactoryInterface
{
public function createButton(): ButtonInterface
{
return new DarkButton();
}
public function createInput(): InputInterface
{
return new DarkInput();
}
}
namespace Practice\DesignPatterns\AbstractFactory;
class LightFactory implements UIFactoryInterface
{
public function createButton(): ButtonInterface
{
return new LightButton();
}
public function createInput(): InputInterface
{
return new LightInput();
}
}
declare(strict_types=1);
use Practice\DesignPatterns\AbstractFactory\DarkFactory;
use Practice\DesignPatterns\AbstractFactory\LightFactory;
use Practice\DesignPatterns\AbstractFactory\UIFactoryInterface;
require "./vendor/autoload.php";
function renderPage(UIFactoryInterface $factory): string {
$button = $factory->createButton();
$input = $factory->createInput();
return $button->render() . "\n" . $input->render();
}
// Simuler un choix de thème (par exemple via GET)
$theme = $_GET['theme'] ?? 'dark';
if ($theme === 'light') {
$factory = new LightFactory();
} else {
$factory = new DarkFactory();
}
echo "";
echo renderPage($factory);
echo "";