Cet article vous présente le modèle de méthode d'usine dans les modèles de conception PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Comme mentionné la dernière fois, l'usine simple n'appartient pas aux vingt-trois modèles de conception de GoF. Cette fois, voici le vrai gars, la célèbre usine . Le Mode Méthode vient au rapport !
Recommandations associées : "Une brève discussion du modèle d'usine simple en PHP"
Explication du diagramme de classes GoF
Par rapport à la fabrique simple, le point central du modèle de méthode de fabrique est de reporter la mise en œuvre aux sous-classes. Comment le comprendre ? Nous pouvons utiliser la fabrique simple de la dernière fois comme classe parent, puis faire en sorte qu'un certain nombre de sous-classes en héritent. La méthode createProduct() devient également une méthode abstraite dans la classe parent. Ensuite, toutes les sous-classes implémentent cette méthode. Il n'est pas nécessaire d'utiliser switch pour juger. La sous-classe peut renvoyer directement un objet instancié.
Définition GoF : définissez une interface pour créer des objets et laissez les sous-classes décider quelle classe instancier. La méthode Factory diffère l’instanciation d’une classe à ses sous-classes.
Diagramme de classes GoF :

- Le produit dans le diagramme de classes est un produit
- Le créateur dans le diagramme de classes est le créateur
- La classe parent créateur a une méthode d'usine abstraite FactoryMethod()
- Toutes les sous-classes de créateur doivent implémenter cette méthode d'usine et renvoyer le correspondant Le spécifique La classe parent du créateur du produit
- peut avoir une méthode d'opération AnOperation(), qui renvoie directement le produit. Vous pouvez utiliser FactoryMethod() pour revenir, de sorte que l'extérieur n'ait besoin que d'appeler AnOperation() de manière unifiée <.>
Implémentation du code
Le premier est l'interface liée au produit et la classe d'implémentation, similaire à celle d'une simple usine :
1 2 3 4 5 6 7 8 9 10 11 | interface Product{
function show() : void;
}
class ConcreteProductA implements Product{
public function show() : void{
echo "I'm A.\n" ;
}
}
|
Copier après la connexion
Le Vient ensuite la classe abstraite et d'implémentation du créateur :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | abstract class Creator{
abstract protected function FactoryMethod() : Product;
public function AnOperation() : Product{
return $this ->FactoryMethod();
}
}
class ConcreteCreatorA extends Creator{
protected function FactoryMethod() : Product{
return new ConcreteProductA();
}
}
|
Copier après la connexion
C'est fondamentalement différent d'une simple usine. Nous avons supprimé le commutateur dégoûtant et avons laissé chaque classe d'implémentation spécifique créer des objets produit. C'est vrai, unique et fermé. Chaque sous-classe de créateur n'est couplée qu'à un seul produit dans la méthode d'usine. Je ne sais pas s'il existe d'autres produits et d'autres usines qui ont coopéré avec des clients dans cette sous-classe.
La même analogie est avec les téléphones portables : je suis un grossiste vendant des téléphones portables (Client, côté entreprise), et j'ai besoin d'un lot de téléphones portables (Produit A), alors je suis allé chercher Foxconn ( Factory Creator) pour m'aider à produire. J'ai expliqué mes besoins à Foxconn et Foxconn a accepté de laisser mon usine de Hengyang (ConcreteCreatorA) s'en occuper. Il n'est pas nécessaire d'aller à l'usine principale. Votre petite commande n'est qu'un gaspillage. Puis, au bout d'un moment, j'ai eu besoin d'un autre modèle de téléphone mobile (produit B) et Foxconn l'a examiné et a demandé à Zhengzhou Foxconn (Concrete Creator B) de m'aider à le produire. Quoi qu'il en soit, ils m'ont toujours donné le téléphone portable correspondant. De plus, l'usine de Zhengzhou ne sait pas ce que l'usine de Hengyang a produit ni si elle a coopéré avec moi. Seuls moi et l'usine principale savons tout cela.
Code complet : modèle de méthode Factory https://github.com/zhangyue0503/designpatterns-php/blob/master/02.factory/source/factory. php
Exemple
Scénario : Parlez simplement et ne pratiquez pas de trucs, modifiez le dernier SMS envoyé, nous utilisons toujours le dernier Plusieurs expéditeurs de SMS . Après tout, tout le monde le connaît déjà, mais il faudra peut-être le remplacer à l'avenir. Les centres commerciaux sont comme des champs de bataille, et les intérêts de chacun doivent primer. Dans ce cas, nous pouvons le découpler via le modèle de méthode d'usine, et nous pouvons facilement ajouter et modifier des fournisseurs SMS.
Diagramme des classes d'envoi de SMS

Implémentation du code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | <?php
interface Message {
public function send(string $msg );
}
class AliYunMessage implements Message{
public function send(string $msg ){
return '阿里云短信(原阿里大鱼)发送成功!短信内容:' . $msg ;
}
}
class BaiduYunMessage implements Message{
public function send(string $msg ){
return '百度SMS短信发送成功!短信内容:' . $msg ;
}
}
class JiguangMessage implements Message{
public function send(string $msg ){
return '极光短信发送成功!短信内容:' . $msg ;
}
}
abstract class MessageFactory{
abstract protected function factoryMethod();
public function getMessage(){
return $this ->factoryMethod();
}
}
class AliYunFactory extends MessageFactory{
protected function factoryMethod(){
return new AliYunMessage();
}
}
class BaiduYunFactory extends MessageFactory{
protected function factoryMethod(){
return new BaiduYunMessage();
}
}
class JiguangFactory extends MessageFactory{
protected function factoryMethod(){
return new JiguangMessage();
}
}
$factory = new BaiduYunFactory();
$message = $factory ->getMessage();
echo $message ->send('您有新的短消息,请查收');
|
Copier après la connexion
Terminé Code source : méthode d'usine d'envoi de SMShttps://github.com/zhangyue0503/designpatterns-php/blob/master/02.factory/source/factory-message.php
Explication
C'est exactement la même chose que le diagramme de classes. Il n'y a fondamentalement aucune explication nécessaire. Faites attention aux caractéristiques du modèle de méthode d'usine et à la mise en œuvre. est reporté à la sous-classe ! ! - Une sous-classe Factory doit être couplée lors de l'appel de l'entreprise. C'est effectivement le cas. Si vous souhaitez qu'un point de vente unifié appelle, veuillez ajouter une simple usine à l'extérieur. C'est une question à laquelle il faut réfléchir
- Ne vous en tenez pas au formulaire actuel et n'avez pas besoin de cours abstraits. utilisez directement une interface pour définir la méthode factory, abandonnez la méthode getMessage() et appelez directement la méthode du modèle public (factoryMethod) en externe
-
Apprentissage recommandé : "
Tutoriel vidéo PHP 》
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!