Une brève discussion sur le modèle de méthode d'usine en PHP

青灯夜游
Libérer: 2023-04-10 08:34:02
avant
2514 Les gens l'ont consulté

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.

Une brève discussion sur le modèle de méthode d'usine en PHP

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 :

Une brève discussion sur le modèle de méthode dusine en PHP

  • 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 :

// 商品接口
interface Product{
    function show() : void;
}

// 商品实现类A
class ConcreteProductA implements Product{
    public function show() : void{
        echo "I&#39;m A.\n";
    }
}
Copier après la connexion

Le Vient ensuite la classe abstraite et d'implémentation du créateur :

// 创建者抽象类
abstract class Creator{

    // 抽象工厂方法
    abstract protected function FactoryMethod() : Product;

    // 操作方法
    public function AnOperation() : Product{
        return $this->FactoryMethod();
    }
}

// 创建者实现类A
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

Une brève discussion sur le modèle de méthode dusine en PHP

Implémentation du code

<?php

interface Message {
    public function send(string $msg);
}

class AliYunMessage implements Message{
    public function send(string $msg){
        // 调用接口,发送短信
        // xxxxx
        return &#39;阿里云短信(原阿里大鱼)发送成功!短信内容:&#39; . $msg;
    }
}

class BaiduYunMessage implements Message{
    public function send(string $msg){
        // 调用接口,发送短信
        // xxxxx
        return &#39;百度SMS短信发送成功!短信内容:&#39; . $msg;
    }
}

class JiguangMessage implements Message{
    public function send(string $msg){
        // 调用接口,发送短信
        // xxxxx
        return &#39;极光短信发送成功!短信内容:&#39; . $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(&#39;您有新的短消息,请查收&#39;);
Copier après la connexion

Terminé Code source : méthode d'usine d'envoi de SMS

https://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!

Étiquettes associées:
source:juejin.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!