Programování
Factory
Metoda na vytvoření celého objektu nebo objektů
Nahrazuje contruktor nějakou metodou, kterou vytvoříme.
Důvody pro tvorbu
  • Construktor se musi jmenovat stejně jako třída, tudiž nemužume mít více typy konstruktorů podle jména
  • Nemužeme přetížit constuktor stejným construktorem, který má stejný parametry, avšak s jinými jmény
        
    
    // NELZE !!
    
    public Sklad(int CelkovyPocetZbozi)
    {
    }
    public Sklad(int CelkovyPocetKategorii)
    {
    }
        
    
  • "optional parameter hell" vznikne tolik dobrovolných hodnot, který se dají dát do konstruktor, že z toho vznikne peklo
        
    public Sklad(string jmeno,int pocetZbozi = 0,int CelkovyPocetZbozi = 0, double mena = 0, string JmenoNadrizeneho = "Joe", int pocetPokusuNaLogin = 3, params string Produkty)
    {
    }
    
        
    
Oproti Builderu tvoříme celý objekt
Možné existence Factory Metodě:
  • Metoda - Factory Method
  • Tvorba v jiné třídě, v takzvané factory - Factory
  • (Pokročile) heirchie abstraktních factory
Systémový příklad je například Color.FromARGB();
Nejlehčí implementace:
    
    private Game()
    {

    }

    public static Game GetInstnce()
    {
        return new Game();
    }
    
Realný příklad v životě
Děláme souřadnicový system a potřebujeme vytvořit třídu point, tahle třída bude mít X a Y, avšak je nutné používat kárteský souřadnicový systém a polární souřadnicový systém
Vytvoříme si tedy enum na tento problém.
    
public enum CoordinateSystem
{
    Cartesian,
    Polar
}
    
Vytvoříme si, lehce naší požadovanou třídu
    
public class Point
{
    private double X {get;set;}
    private double Y {get;set;}
    
    // Vytváří point bud z Polar NEBO z Kartérského
    public Point(double a, double b, CoordinateSystem system)
    {
        switch(system)
        {
            case CoordinateSystem.Cartesian:
                X = a;
                Y = b;
                break;
            case CoordinateSystem.Cartesian:
                X = a * Math.Cos(b);
                Y = b * Math.Sin(a);
                break;
        }
    }
}
    
třídá se zdá na první pohled naprosto v pořádku, ovšem tímto jsme udělali 2 věci, které šli napsat lépe
  • Každý kdo bude vytvářet třídu Point, musí být obeznámen, co znamená CoordinateSystem a jejich převod, pokud to nepřečte, vzniknou problémy
  • Je nutnost specifikovat o jaky souřadnicový systém se jedná
    
public class Point
{
    private double X {get;set;}
    private double Y {get;set;}

    private Point(double x, double y)
    {
        X = x;
        Y = y;
    }

    public static Point NewCartesianPoint(double x, double y)
    {
        return new Point(x, y)    
    }

    public static Point NewPolarPoint(double rho, double theta)
    {
        return new Point(rho * Math.Cos(theta), theta * Math.Sin(rho))
    }
    
Třída je nyní velmi jednoduchá na používání, pokud uživatel chce Polar, tak zavolá NewPolarPoint a pokud kartenský tak zavolá NewCartesianPoint. Tímto způsobem jsme vytvořili čitelný kod pro ostatní kolegy.