Patterns / Creational patterns
image

using System;

//client code
void TestFactory(IFactory factory) {
    IProductA productA = factory.CreateA();
    IProductB productB = factory.CreateB();
    productA.TestA();
    productB.TestB();
}

TestFactory(new Factory1());
//printed: test A1
//         test B1
TestFactory(new Factory2());
//printed: test A2
//         test B2

//abstract factory
interface IFactory {
    IProductA CreateA();
    IProductB CreateB();
}

//concrete factory 1
class Factory1IFactory {
    public IProductA CreateA() {
        return new ProductA1();
    }
    public IProductB CreateB() {
        return new ProductB1();
    }
}

//concrete factory 2
class Factory2IFactory {
    public IProductA CreateA() {
        return new ProductA2();
    }
    public IProductB CreateB() {
        return new ProductB2();
    }
}

//abstract product A
interface IProductA {
    void TestA();
}

//abstract product B
interface IProductB {
    void TestB();
}

//concrete product A1
class ProductA1IProductA {
    public void TestA() {
        Console.WriteLine("test A1");
    }
}

//concrete product A2
class ProductA2IProductA {
    public void TestA() {
        Console.WriteLine("test A2");
    }
}

//concrete product B1
class ProductB1IProductB {
    public void TestB() {
        Console.WriteLine("test B1");
    }
}

//concrete product B2
class ProductB2IProductB {
    public void TestB() {
        Console.WriteLine("test B2");
    }
}


Provides an interface for creating families of objects whose interfaces are known but concrete classes are not.