Crea una instancia de varias familias de clases
Definición
Proporcionar una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas.
Frecuencia de uso:

High
UML class diagram

Las clases y los objetos que participan en este modelo son:
- AbstractFactory (ContinentFactory)
- declara una interfaz para las operaciones que crean productos abstractos
- ConcreteFactory (AfricaFactory, AmericaFactory)
- implementa las operaciones para crear objetos de productos concretos
- AbstractProduct (Herbivore, Carnivore)
- declara una interfaz para un tipo del objeto Product
- Product (Wildebeest, Lion, Bison, Wolf)
- define un objeto de producto que se crea por la correspondiente fábrica de hormigón
- implementa la interfaz AbstractProduct
- Client (AnimalWorld)
- utiliza interfaces declaradas por las clases AbstractFactory y AbstractProduct
Código estructural en C #
Este código estructural demuestra el patrón Abstract Factory crear jerarquías paralelas de los objetos. Creación de objetos ha sido abstraído y no hay necesidad de nombres de clase no modificables en el código de cliente.
- using System;
- namespace Abstract.Structural
- {
- /// <summary>
- /// MainApp startup class for Structural
- /// Abstract Factory Design Pattern.
- /// </summary>
- class MainApp
- {
- /// <summary>
- /// Entry point into console application.
- /// </summary>
- public static void Main()
- {
- // Abstract factory #1
- AbstractFactory factory1 = new ConcreteFactory1();
- Client client1 = new Client(factory1);
- client1.Run();
- // Abstract factory #2
- AbstractFactory factory2 = new ConcreteFactory2();
- Client client2 = new Client(factory2);
- client2.Run();
- // Wait for user input
- Console.ReadKey();
- }
- }
- /// <summary>
- /// The 'AbstractFactory' abstract class
- /// </summary>
- abstract class AbstractFactory
- {
- public abstract AbstractProductA CreateProductA();
- public abstract AbstractProductB CreateProductB();
- }
- /// <summary>
- /// The 'ConcreteFactory1' class
- /// </summary>
- class ConcreteFactory1 : AbstractFactory
- {
- public override AbstractProductA CreateProductA()
- {
- return new ProductA1();
- }
- public override AbstractProductB CreateProductB()
- {
- return new ProductB1();
- }
- }
- /// <summary>
- /// The 'ConcreteFactory2' class
- /// </summary>
- class ConcreteFactory2 : AbstractFactory
- {
- public override AbstractProductA CreateProductA()
- {
- return new ProductA2();
- }
- public override AbstractProductB CreateProductB()
- {
- return new ProductB2();
- }
- }
- /// <summary>
- /// The 'AbstractProductA' abstract class
- /// </summary>
- abstract class AbstractProductA
- {
- }
- /// <summary>
- /// The 'AbstractProductB' abstract class
- /// </summary>
- abstract class AbstractProductB
- {
- public abstract void Interact(AbstractProductA a);
- }
- /// <summary>
- /// The 'ProductA1' class
- /// </summary>
- class ProductA1 : AbstractProductA
- {
- }
- /// <summary>
- /// The 'ProductB1' class
- /// </summary>
- class ProductB1 : AbstractProductB
- {
- public override void Interact(AbstractProductA a)
- {
- Console.WriteLine(this.GetType().Name +
- " interacts with " + a.GetType().Name);
- }
- }
- /// <summary>
- /// The 'ProductA2' class
- /// </summary>
- class ProductA2 : AbstractProductA
- {
- }
- /// <summary>
- /// The 'ProductB2' class
- /// </summary>
- class ProductB2 : AbstractProductB
- {
- public override void Interact(AbstractProductA a)
- {
- Console.WriteLine(this.GetType().Name +
- " interacts with " + a.GetType().Name);
- }
- }
- /// <summary>
- /// The 'Client' class. Interaction environment for the products.
- /// </summary>
- class Client
- {
- private AbstractProductA _abstractProductA;
- private AbstractProductB _abstractProductB;
- // Constructor
- public Client(AbstractFactory factory)
- {
- _abstractProductB = factory.CreateProductB();
- _abstractProductA = factory.CreateProductA();
- }
- public void Run()
- {
- _abstractProductB.Interact(_abstractProductA);
- }
- }
- }
Resultado
ProductB1 interacts with ProductA1
ProductB2 interacts with ProductA2
Código del mundo real en C #
ProductB2 interacts with ProductA2
Este código del mundo real demuestra la creación de diferentes animales para un juego de ordenador utilizando diferentes fábricas. Aunque los animales creados por las fábricas son de continente diferentes, las interacciones entre los animales siguen siendo los mismos.
- using System;
- namespace Abstract.RealWorld
- {
- /// <summary>
- /// MainApp startup class for Real-World
- /// Abstract Factory Design Pattern.
- /// </summary>
- class MainApp
- {
- /// <summary>
- /// Entry point into console application.
- /// </summary>
- public static void Main()
- {
- // Create and run the African animal world
- ContinentFactory africa = new AfricaFactory();
- AnimalWorld world = new AnimalWorld(africa);
- world.RunFoodChain();
- // Create and run the American animal world
- ContinentFactory america = new AmericaFactory();
- world = new AnimalWorld(america);
- world.RunFoodChain();
- // Wait for user input
- Console.ReadKey();
- }
- }
- /// <summary>
- /// The 'AbstractFactory' abstract class
- /// </summary>
- abstract class ContinentFactory
- {
- public abstract Herbivore CreateHerbivore();
- public abstract Carnivore CreateCarnivore();
- }
- /// <summary>
- /// The 'ConcreteFactory1' class
- /// </summary>
- class AfricaFactory : ContinentFactory
- {
- public override Herbivore CreateHerbivore()
- {
- return new Wildebeest();
- }
- public override Carnivore CreateCarnivore()
- {
- return new Lion();
- }
- }
- /// <summary>
- /// The 'ConcreteFactory2' class
- /// </summary>
- class AmericaFactory : ContinentFactory
- {
- public override Herbivore CreateHerbivore()
- {
- return new Bison();
- }
- public override Carnivore CreateCarnivore()
- {
- return new Wolf();
- }
- }
- /// <summary>
- /// The 'AbstractProductA' abstract class
- /// </summary>
- abstract class Herbivore
- {
- }
- /// <summary>
- /// The 'AbstractProductB' abstract class
- /// </summary>
- abstract class Carnivore
- {
- public abstract void Eat(Herbivore h);
- }
- /// <summary>
- /// The 'ProductA1' class
- /// </summary>
- class Wildebeest : Herbivore
- {
- }
- /// <summary>
- /// The 'ProductB1' class
- /// </summary>
- class Lion : Carnivore
- {
- public override void Eat(Herbivore h)
- {
- // Eat Wildebeest
- Console.WriteLine(this.GetType().Name +
- " eats " + h.GetType().Name);
- }
- }
- /// <summary>
- /// The 'ProductA2' class
- /// </summary>
- class Bison : Herbivore
- {
- }
- /// <summary>
- /// The 'ProductB2' class
- /// </summary>
- class Wolf : Carnivore
- {
- public override void Eat(Herbivore h)
- {
- // Eat Bison
- Console.WriteLine(this.GetType().Name +
- " eats " + h.GetType().Name);
- }
- }
- /// <summary>
- /// The 'Client' class
- /// </summary>
- class AnimalWorld
- {
- private Herbivore _herbivore;
- private Carnivore _carnivore;
- // Constructor
- public AnimalWorld(ContinentFactory factory)
- {
- _carnivore = factory.CreateCarnivore();
- _herbivore = factory.CreateHerbivore();
- }
- public void RunFoodChain()
- {
- _carnivore.Eat(_herbivore);
- }
- }
- }
Resultado
Lion eats Wildebeest
Wolf eats Bison
Wolf eats Bison
No hay comentarios:
Publicar un comentario