8
votes

Est-ce la façon dont le modèle d'usine fonctionne?

Le singleton et les modèles de registre étaient très simples et faciles pour moi de comprendre tout de suite, mais le motif d'usine a été quelque chose que je n'ai pas pu obtenir mon cerveau à interpréter à 100%. Je pense que je pourrais le comprendre maintenant, j'ai écrit un exemple de code ci-dessous, s'il vous plaît examiner et dites-moi s'il s'agit de l'utilisation appropriée du modèle d'usine. L'échantillon est en php ... xxx

de manière générale Les objets de base de données, de cache et de session sont créés (non présentés ici), ils sont ajoutés à l'objet d'usine, je peux construire une méthode Dans la classe d'usine pour chaque objet qui aura besoin de ces 3 dépendances et je peux définir lesquels ils obtiennent aussi. Cela le rend également là où les classes individuelles peuvent toujours être quelque peu portables, car je peux injecter directement des dépendances si je voulais sans l'objet d'usine. Est-ce que ça sonne bien? Si cela a raison, cela sonne vraiment utile


update # 1

Ceci est basé sur cela ici un article de blog I ici http://www.potstuck.com/2009/01/08/PHP- Dépendance-injection / Ils se réfèrent à cela comme une "usine", j'utilisais un registre et beaucoup de gens continuent à me dire de regarder une "usine" et tout ce que j'ai lu à ce sujet n'a pas cliqué sur Ma tête jusqu'à ce que je lisais cet article mais on dirait que ce n'est pas une "usine"?


Mise à jour # 2
De wikipedia http://en.wikipedia.org/wiki/factory_Object Dans la programmation informatique orientée objet, un objet d'usine est un objet de création d'autres objets. C'est une abstraction d'un constructeur et peut être utilisé pour mettre en œuvre divers systèmes d'allocation, tels que le modèle Singleton. Un objet d'usine a généralement une méthode pour chaque type d'objet qu'il est capable de créer. Ces méthodes acceptent éventuellement des paramètres définissant la manière dont l'objet est créé, puis renvoyez l'objet créé. Les objets d'usine sont utilisés dans des situations où la prise d'un objet d'un type particulier est un processus plus complexe que de créer un nouvel objet. L'objet d'usine peut décider de créer la classe de l'objet (le cas échéant) de manière dynamique, de la remettre à partir d'un pool d'objets, de configuration complexe sur l'objet ou d'autres choses.

alors peut-être que c'est un "objet d'usine" d'une manière après ...


5 commentaires

Pouvez-vous fournir une source décrivant ce modèle 'usine'? Je connais des modèles appelés «abstrait» et «méthode d'usine», mais pas seulement «usine».


@Mark semble avoir mis à jour mon message avec un lien vers le site


@jasondavis: Je vois ... pas particulièrement utile, cependant. Il serait préférable d'aller tout le chemin et d'utiliser DI et un conteneur DI approprié puis.


@Mark Sememann Je dois examiner cela, je ne pense pas que j'ai vu cela en utilisation encore dans n'importe quel code (je suis nouveau à toute la chose de OO, alors ne soyez donc pas surpris) lorsque j'entends les mots di conteneur Cela me rappelle un registre, je stocke actuellement des objets dans un registre, puis dans le registre dans les obèses qui nécessitent un accès, est-ce similaire?


Ils peuvent sembler similaires, mais DI est beaucoup plus que cela. Cependant, je ne sais pas à quel point le concept de conteneur entier est répandu pour PHP - je suis un développeur .NET moi-même, vous voudrez peut-être enquêter sur ce premier ...


5 Réponses :


1
votes

ressemble plus à la motion de constructeur pour moi. Quel modèle d'usine avez-vous réellement signé, Abaltactory ou FactoryMethod? Cependant, ils traitent tous les deux sur l'héritage et que vous codez simplement assembler un objet «complexe».


2 commentaires

Ceci est basé sur cela ici ici Poteck.com/2009/01/08 / php-dépendance-injection Je ne suis pas vraiment sûr, j'utilisais un registre et beaucoup de gens continuent à me dire de regarder dans une "usine" et tout ce que j'ai lu à ce sujet n'a pas cliqué dans mon tête jusqu'à ce que je lisais cet arcle


L'article discuté concerne l'injection de dépendance non pas dans les usines. J'adite que le terme usine est parfois utilisé à des fins différentes. Mais ce n'est certainement pas l'un des modèles d'usine du livre Gof.



3
votes

ne ressemble pas à une usine pour moi - pourrait être un constructeur à l'extérieur ?; 0)

usine est un moyen de cacher la mise en œuvre et l'instanciation. Et il y a généralement une certaine montage fait, mais en une noisette .... xxx


1 commentaires

+1 déchirait et collé sans vergogne dans mes notes de motif design. Première implémentation de PHP sensible que j'ai de ce modèle. Merci bourgeon.



2
votes

Comme il semble que vous souhaitiez simplement créer un utilisateur, je ne vois pas le besoin d'un facteur de résumé, désormais simplement appelé usine. L'idée d'usines est de créer des objets qui implémentent une certaine interface. Vous voudrez pouvoir instancier deux implémentations différentes de la même interface. Le point est que vous devrez peut-être créer ces objets encore et encore et changez-le de ObjectA pour s'opposer à ce que le code est lourde. L'échange de l'usine est facile, car il est souvent un singleton.

L'idée de la méthode d'usine est liée aux cadres: vous souhaitez créer une utilisation dans certains codes-cadre, mais la mise en œuvre réelle des utilisateurs est en cours dérivés, c'est-à-dire qu'il y a des utilisateurs de votre cadre écrivant leur propre application. Pour dire à l'utilisateur de votre framework "Créer un objet utilisateur maintenant", qui est un appel à la méthode d'usine. L'utilisateur doit mettre en œuvre cela. Cela s'appelle également une conducteur virtuelle selon GOF.

Le constructeur est généralement utilisé lorsqu'il y a des représentations différentes de l'objet, ce qui n'est pas vraiment le cas ici. Dans mes yeux, le cache, la base de données et la session pourraient être mis en œuvre comme des singletons, assouplissant ainsi les subtilités impliquées. Sinon, je suggérerais d'utiliser un serviceLocator qui vous permet de getdatabase , greatession , etc. Ensuite, vous devez transmettre le localisateur à l'objet utilisateur (et de nombreux autres objets ) sur la création. L'avantage est que ce localisateur peut être réutilisé à travers différentes classes.


2 commentaires

Ce locator vous parlez semble plus que ce que je cherche. Je suis actuellement en train de réserver une référence à des objets tels que la session, la base de données, le cache dans un registre actuel, puis injectant le registre dans d'autres objets de la création, est-ce similaire du tout?


Je pense que oui, essentiellement. Je vous suggère de lire ces deux articles de Martin Fowler: martinfowler.com/articles/injection.html martinfowler.com/aacatalog/registry.html Il l'explique en détail et mieux que je ne pouvais , aussi, je suppose que 500 caractères ne feront pas le travail :) De plus, vous voudrez peut-être obtenir une copie de son livre "Modèles d'architecture d'applications d'entreprise", cela vaut chaque centime. En général, je dirais que l'inversion de contrôle et d'injection de dépendance est plus complexe que les schémas de base, dont l'un est le modèle d'usine de sorte que cela le prend beaucoup plus loin que votre OQ.



5
votes

C'est le modèle d'usine, mais vous pourriez avoir besoin d'une meilleure convention de dénomination que de l'appeler usine code>. En outre, il contient des traces d'injection de dépendance.

Bien que vous puissiez appeler techniquement le motif d'usine, ce n'est probablement pas une bonne utilisation du motif. L'usine est un modèle de création qui encapsule votre code à partir de noms de classe et de création d'objet directement comme dans les paramètres exacts du constructeur, etc. Pour obtenir les meilleurs résultats, gardez-le à l'esprit tout en concevant vos classes et usines. P>

Par exemple , Stackoverflow donne aux utilisateurs des droits différents selon leur réputation But. Hypothétiquement parlant, il pourrait avoir les types d'utilisateurs suivants: p> xxx pré>

et un utilisateur pourrait être créé en recherchant leur représentant. et instancier de l'objet utilisateur correspondant en faisant référence directement à la classe. Jon Skeet n'apparaît dans aucune catégorie au cas où vous vous demandez. Voici une implémentation de merde avec instanciation directe: p> xxx pré>

Si plus tard dans la route, nous devions modifier les noms de classe ou la manière dont les utilisateurs ont été instanciés, chaque instance de ce type d'objet a été créé. devrait être trouvé et changé. Bon beaucoup de travail si vous me demandez. Au lieu de cela, si nous avions utilisé le modèle d'usine ici, le changement irait dans une seule méthode à l'intérieur de la classe d'usine. P>

class UserFactory {
    public static User createUser(Integer reputation) {
        ...
    }
}


3 commentaires

Je dois dire que j'aime les "noms de classement hypothétiques", je vais devoir sauver celles des rangs sur un futur forum que je planifie!


Cela signifie-t-il que Jon Skeet est au-dessus de Dieu?


@jason, qui pourrait être un excellent moyen de conduire des utilisateurs actifs de votre site :)



6
votes

résumés et étendue mes commentaires d'en dessous de la question ici

Comme les autres a dit, ce n'est pas un usine , simplement parce qu'un motif avec ce nom n'existe pas. C'est soit un abstraitFactory ou un FactoryMethod , bien que de manière pragmatique, les gens se réfèrent souvent à ou en disant simplement usine et c'est bien avec moi.

session, cache et dB sont généralement quelque chose que vous initialiserez tôt dans votre flux d'applications, il s'agit donc essentiellement de travaux de bootstrap. Je reçois l'impression que vous recherchez n'est pas tellement la création d'objets, mais de leur manipulation tout au long de l'application. C'est une préoccupation quelque peu différente de ce que a usinewhatever fait.

Comme je l'ai dit dans les commentaires, juste parce que ce n'est pas exactement un usinewhatever , ne signifie pas que votre code est mauvais. Si cela résout votre problème, c'est cool. Mais je pense toujours que ce que vous essayez de faire, par exemple. Créer et Gestion des ressources au moment de l'exécution est le mieux utilisé avec un di service Conteneur .

Si vous ne voulez pas utiliser un conteneur di conteneur maintenant pour cela, vous pouvez consulter zend_application et comment ils bootstrap sont des ressources . C'est une alternative et laisse la possibilité de Ajoutez des conteneurs DI plus tard.

En fait, beaucoup de sujets de vos questions précédentes ont déjà été résolus dans votre cadre Zend. Classes de configuration. Je ne dis pas utiliser Zf, mais vous pourriez vérifier pour voir comment ils font les choses. Bien sûr, vous pouvez consulter le autre cadres aussi.

Certains sites de motif avec exemples PHP:


2 commentaires

Merci pour les liens que je lisais simplement cette page en.wikipedia.org/wiki/Factory_Object et Cela ressemble en quelque sorte à ce que je me passe dans le code ci-dessus, je vais lire sur les liens que vous avez fournis cependant, mon projet est fondamentalement en attente jusqu'à ce que je trouve la meilleure approche de tout cela, je veux le faire correctement la première fois ou au mieux que je puisse quand même


Je crois, vous ne pouvez pas le faire droit dès le début. Penser à l'avenir, c'est bien (et nécessaire), mais j'utilise donc ce qui fonctionne maintenant jusqu'à ce qu'il ne fonctionne plus, puis le refacteur.