Je suis en train d'assembler une explication et un exemple de code de ce motif de conception, essayant d'aider les autres autour de moi à le saisir (ainsi que de maîtriser le motif).Modèle de conception d'usine (nécessitant une critique)
Ce que je cherche, c'est les opinions & ou la critique de mon explication et l'exemple de code ... merci!
Quel est le modèle d'usine? Le modèle d'usine utilise un «objet créateur d'objet» dédié particulier pour gérer la création d'objets - et la plupart du temps l'instanciation - d'objets similaires à une usine du monde réel.
monde réel exemple
penser à une usine automobile étant le créateur de divers types d'automobiles. Une des chaînes de montage de cette usine automobile peut produire un camion un jour, mais un autre jour peut être ré-usiné pour produire des voitures. Supposons qu'un concessionnaire passe une commande de 10 voitures à son service de gestion de compte. Ce département utilise ensuite une certaine usine et commande les 10 voitures. Les gestionnaires de compte ne sont pas concernés par la fabrication des voitures elles-mêmes (imaginez les résultats médiocres), ils ne travaillent qu'avec le produit final, en s'assurant que le concessionnaire obtient leurs véhicules. Un nouveau modèle de cette même voiture sort l'année suivante et les commandes commencent à affluer. Les gestionnaires de compte (toujours pas concerné par la production de la voiture) passent les commandes, mais maintenant la voiture qu'ils reçoivent est différente, la méthode d'assemblage ou même peut-être l'usine peut être différente, mais les gestionnaires de compte ne doivent pas s'inquiéter à ce sujet. Autre idée: les monteurs d'usine des véhicules peuvent savoir exactement quelle action prendre lorsqu'un certain gestionnaire de compte passe une commande (par exemple, le gestionnaire de compte X passe une commande, l'assembleur d'usine sait que pour le gestionnaire de compte X, ils produisent 10 véhicules de type Y). Une autre option peut être que le gestionnaire de compte indique à l'assembleur exactement quel type de véhicule à produire. Si les gestionnaires de compte traitaient également la création des véhicules (c'est-à-dire qu'ils étaient couplés), chaque fois qu'un véhicule changeait de quelque façon que ce soit, chacun des gestionnaires de compte devait être recyclé pour produire ce véhicule. Cela créerait des problèmes de qualité car il y a beaucoup plus de gestionnaires de comptes qu'il n'y aurait d'usines ... des erreurs se produiraient, les dépenses seraient beaucoup plus importantes.
Entourant Retour à la POO
Une usine d'objet en tant que modèle de conception appliquée à l'ingénierie du logiciel est similaire à l'exemple ci-dessus dans le concept ... L'usine barattes différents types d'autres objets, vous pouvez utiliser une ligne d'assemblage (objet assembleur) qui produit un certain type d'objet, renvoyé d'une certaine manière. L'assembleur peut inspecter le client demandeur et le gérer, ou le client peut indiquer à l'assembleur quel objet il requiert. Maintenant ... vous êtes sur un projet et créez une fabrique d'objets et divers assembleurs, plus tard dans le projet, les exigences changent légèrement, il vous est maintenant demandé de modifier le contenu de l'objet et comment ses clients manipulent cet objet. Étant donné que vous avez utilisé le modèle d'usine, il s'agit d'un simple changement. Dans un emplacement, vous pouvez modifier ou ajouter les objets produits par l'usine et modifier le format dans lequel les assembleurs placent le contenu de l'objet. La manière malheureuse d'avoir fait ceci aurait été sans méthode d'usine, en instanciant chaque instance d'objet et en mettant en forme le contenu d'objet dans les clients eux-mêmes ... disons que vous avez utilisé cet objet particulier dans 20 clients. Maintenant, vous devez aller à chacun des clients, modifier chacune des instances d'objets et des formats ... quelle perte de temps ... Soyez paresseux ... faites-le de la bonne façon la première fois afin de vous sauver (et d'autres) le temps et l'effort plus tard.
Exemple de code (C#)
Voici un exemple en utilisant une usine pour la nourriture et divers objets alimentaires
Factory module
public enum FoodType
{
//enumerated foodtype value, if client wants to specify type of object, coupling still occurs
Hamburger, Pizza, HotDog
}
/// <summary>
/// Object to be overridden (logical)
/// </summary>
public abstract class Food
{
public abstract double FoodPrice { get; }
}
/// <summary>
/// Factory object to be overridden (logical)
/// </summary>
public abstract class FoodFactory
{
public abstract Food CreateFood(FoodType type);
}
//-------------------------------------------------------------------------
#region various food objects
class Hamburger : Food
{
double _foodPrice = 3.59;
public override double FoodPrice
{
get { return _foodPrice; }
}
}
class Pizza : Food
{
double _foodPrice = 2.49;
public override double FoodPrice
{
get { return _foodPrice; }
}
}
class HotDog : Food
{
double _foodPrice = 1.49;
public override double FoodPrice
{
get { return _foodPrice; }
}
}
#endregion
//--------------------------------------------------------------------------
/// <summary>
/// Physical factory
/// </summary>
public class ConcreteFoodFactory : FoodFactory
{
public override Food CreateFood(FoodType foodType)
{
switch (foodType)
{
case FoodType.Hamburger:
return new Hamburger();
break;
case FoodType.HotDog:
return new HotDog();
break;
case FoodType.Pizza:
return new Pizza();
break;
default:
return null;
break;
}
}
}
/// <summary>
/// Assemblers
/// </summary>
public class FoodAssembler
{
public string AssembleFoodAsString(object sender, FoodFactory factory)
{
Food food = factory.CreateFood(FoodType.Hamburger);
if (sender.GetType().Name == "default_aspx")
{
return string.Format("The price for the hamburger is: ${0}", food.FoodPrice.ToString());
}
else
{
return food.FoodPrice.ToString();
}
}
public Food AssembleFoodObject(FoodFactory factory)
{
Food food = factory.CreateFood(FoodType.Hamburger);
return food;
}
}
Calling factory
FoodFactory factory = new ConcreteFoodFactory(); //create an instance of the factoryenter code here
lblUser.Text = new FoodAssembler().AssembleFoodAsString(this, factory); //call the assembler which formats for string output
Object o = new FoodAssembler().AssembleFoodObject(factory); //example: instantiating anon object, initialized with created food object
wiki communautaire, peut-être? –
Pourquoi les votes serrés? La question est valide, même si elle est un peu longue :) – jgauffin