Programování
Factory
Metoda na vytvoření celého objektu nebo objektů
Nahrazuje contruktor nějakou metodou, kterou vytvoříme.
Důvody pro tvorbu
Možné existence Factory Metodě:
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) { }
Možné existence Factory Metodě:
- Metoda - Factory Method
- Tvorba v jiné třídě, v takzvané factory - Factory
- (Pokročile) heirchie abstraktních factory
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.
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.