public static void Main()
AbstractFactory factory1 = new ConcreteFactory();
Client client1 = new Client(factory1);
AbstractFactory factory2 = new ConcreteFactory();
Client client2 = new Client(factory2);
abstract class AbstractFactory{
public abstract AbstractProductA CreateProductA();
public abstract AbstractProductB CreateProductB();
class ConcreteFactory : AbstractFactory {
public override AbstractProductA CreateProductA(){
public override AbstractProductB CreateProductB(){
class ConcreteFactory2 : AbstractFactory {
public override AbstractProductA CreateProductA(){
public override AbstractProductB CreateProductB(){
abstract class AbstractProductA {
abstract class AbstractProductB {
public abstract void Interact(AbstractProductA a);
class ProductA1 : AbstractProductA {
class ProductA2 : AbstractProductA {
class ProductB1 : AbstractProductB {
public override void Interact(AbstractProductA a) {
Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name);
class ProductB2 : AbstractProductB {
public override void Interact(AbstractProductA a) {
Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name);
private AbstractProductA _abstractProductA;
private AbstractProductB _abstractProductB;
public Client(AbstractFactory factory) {
_abstractProductA = factory.CreateProductA();
_abstractProductB = factory.CreateProductB();
_abstractProductB.Interact(_abstractProductA);