2010-05-31 3 views
0

Je suis nouveau dans la conception de modèles et j'ai un scénario ici. Je ne suis pas sûr de la façon de mettre en œuvre le modèle.Comment appliquer Abstract Factory Pattern?

  1. Nous avons plusieurs fournisseurs Philips, Onida, etc.
  2. Chaque fournisseur (philips, Onida, etc) peuvent avoir différents types de produits à savoir téléviseur plasma ou normal.

Je veux un produit spécifique de chaque fournisseur utilisant Abstract Factory Pattern.

Ma mise en œuvre jusqu'à présent:

public enum TvType 
{ 
    Samsung = 0, LG = 1, Philips = 2, Sony = 3 
} 

public enum Product 
{ 
    Plasma = 0, NormalTV = 1 
} 

Classe de béton de chaque fournisseur qui retourne chaque produit et également l'interface qui contient ProductInfo à savoir si fournisseur est que alors il doit avoir ce produit.

Répondre

0

En pseudocode il pourrait être quelque chose comme ceci:

interface TvFactory { 
    NormalTelevision createNormalTv(); 
    PlasmaTelevision createPlasmaTv(); 
} 

class PhilipsTvFactory implements TvFactory { 
    public NormalTelevision createNormalTv() { 
    return new PhilipsNormalTelevision(); 
    } 
    public PlasmaTelevision createPlasmaTv() { 
    return new PhilipsPlasmaTelevision(); 
    } 
} 

class OnidaTvFactory implements TvFactory { 
    public NormalTelevision createNormalTv() { 
    return new OnidaNormalTelevision(); 
    } 
    public PlasmaTelevision createPlasmaTv() { 
    return new OnidaPlasmaTelevision(); 
    } 
} 

// similarly for other vendors... 

... 
// decides - maybe based on config - which factory to use 
TvFactory factory = loadTvFactory(); 
Television myTv = factory.createPlasmaTv(); 
+0

En termes de décider quelle usine à utiliser, faire la classe qui doit utiliser le résumé d'usine, et les classes d'extension fournissent l'usine qui est ensuite acquise par la classe de base par un appel à sa méthode abstraite getTvFactory. – Finbarr

+0

@Finbarr, c'est une façon de faire, bien que je préfère une classe de chargeur d'usine séparée. Cela rend le code réutilisable. –

+0

Ceci est un ballonnement fou. et la différence entre toutes ces usines sera juste une seule valeur d'énumérateur après que le 'nouveau' est appelé? Waw, génial génie logiciel ici. Veuillez relire vos principes [SOLID] (http://www.blackwasp.co.uk/SOLIDPrinciples.aspx). –

0

énumérations sont mal. Remplacez-les par des interfaces:

public interface IVendor { /*...*/ } 

Vous pouvez ensuite fournir des implémentations concrètes de IVender pour chacun de vos fournisseurs.

public class Samsung : IVendor { /*...*/ } 

public class Philips : IVendor { /*...*/ } 

public class Sony : IVendor { /*...*/ } 

On ne sait pas à ma raison pour laquelle vous demandez à propos de Abstract Factory, ou ce que vous voulez être en mesure de faire exactement ...

+1

Enums peut implémenter des interfaces :-) – Finbarr

+0

@Finbarr, dans certaines langues, oui. Cependant, la langue n'est pas spécifiée ici. A en juger par l'extrait de code, ce n'est pas C++, ni Java - pourrait-il être C#? –

+0

Oui ... Il est C# – Amit