using System;
namespace AbstractFactoryFunc{
public abstract class AbstractProductA{
public abstract void ProductAMethod();
}
public class ProductA1 : AbstractProductA{
public override void ProductAMethod(){
Console.Write(this.ToString() + " : Method!");
Console.Read();
}
}
public class ProductA2 : AbstractProductA{
public override void ProductAMethod(){
Console.Write(this.ToString() + " : Method!");
Console.Read();
}
}
public abstract class AbstractProductB{
public abstract void ProductBMethod();
}
public class ProductB1 : AbstractProductB{
public override void ProductBMethod(){
Console.Write(this.ToString() + " : Method!");
Console.Read();
}
}
public class ProductB2 : AbstractProductB{
public override void ProductBMethod(){
Console.Write(this.ToString() + " : Method!");
Console.Read();
}
}
public abstract class AbstractFactory{
public abstract AbstractProductA CreateProductA();
public abstract AbstractProductB CreateProductB();
}
public class ConcreteFactory1 : AbstractFactory{
public override AbstractProductA CreateProductA()
{
return new ProductA1();
}
public override AbstractProductB CreateProductB()
{
return new ProductB1();
}
}
public class ConcreteFactory2 : AbstractFactory{
public override AbstractProductA CreateProductA()
{
return new ProductA2();
}
public override AbstractProductB CreateProductB()
{
return new ProductB2();
}
}
public class Client{
public AbstractProductA abstractProductA;
public AbstractProductB abstractProductB;
public Client(AbstractFactory abstractFactory){
abstractProductA = abstractFactory.CreateProductA();
abstractProductB = abstractFactory.CreateProductB();
}
public void Run()
{
abstractProductA.ProductAMethod();
abstractProductB.ProductBMethod();
}
}
public class EntryPoint{
public static void Main(string[] args){
AbstractFactory factory1 = new ConcreteFactory1();
Client myClient = new Client(factory1);
myClient.Run();
Console.Read();
Console.ReadKey();
}
}
}