Szukaj…


Metoda statyczna fabryka

Możemy podać sensowną nazwę dla naszych konstruktorów.

Możemy dostarczyć kilku konstruktorów o tej samej liczbie i typie parametrów, czego, jak widzieliśmy wcześniej, nie możemy zrobić z konstruktorami klas.

public class RandomIntGenerator {
    private final int min;
    private final int max;
 
    private RandomIntGenerator(int min, int max) {
        this.min = min;
        this.max = max;
    }
     
    public static RandomIntGenerator between(int max, int min) {
        return new RandomIntGenerator(min, max);
    }
     
    public static RandomIntGenerator biggerThan(int min) {
        return new RandomIntGenerator(min, Integer.MAX_VALUE);
    }
     
    public static RandomIntGenerator smallerThan(int max) {
        return new RandomIntGenerator(Integer.MIN_VALUE, max);
    }
 
    public int next() {...}
}

Ukrywanie bezpośredniego dostępu do konstruktora

Możemy uniknąć zapewniania bezpośredniego dostępu do konstruktorów intensywnie korzystających z zasobów, takich jak bazy danych. klasa publiczna DbConnection {private static final int MAX_CONNS = 100; private static int totalConnections = 0;

   private static Set<DbConnection> availableConnections = new HashSet<DbConnection>();

   private DbConnection()
   {
     // ...
     totalConnections++;
   }

   public static DbConnection getDbConnection()
   {
     if(totalConnections < MAX_CONNS)
     {
       return new DbConnection();
     }

     else if(availableConnections.size() > 0)
     {
         DbConnection dbc = availableConnections.iterator().next();
         availableConnections.remove(dbc);
         return dbc;
     }

     else {
       throw new NoDbConnections();
     }
   }

   public static void returnDbConnection(DbConnection dbc)
   {
     availableConnections.add(dbc);
     //...
   }
}

Metoda fabryki statycznej C #

Statyczna metoda fabryczna jest odmianą wzorca metody fabrycznej . Służy do tworzenia obiektów bez konieczności samodzielnego wywoływania konstruktora.

Kiedy stosować statyczną metodę fabryczną

  • jeśli chcesz nadać sensowną nazwę metodzie, która generuje obiekt.
  • jeśli chcesz uniknąć tworzenia nadmiernie złożonych obiektów, zobacz Tuple Msdn .
  • jeśli chcesz ograniczyć liczbę tworzonych obiektów (buforowanie)
  • jeśli chcesz zwrócić obiekt dowolnego podtypu typu zwracanego.

Istnieją pewne wady, takie jak

  • Klasy bez publicznego lub chronionego konstruktora nie mogą być inicjowane w statycznej metodzie fabrycznej.
  • Statyczne metody fabryczne są jak zwykłe metody statyczne, więc nie można ich odróżnić od innych metod statycznych (może to różnić się w zależności od IDE)

Przykład

Pizza.cs

public class Pizza
{
    public int SizeDiameterCM
    {
        get;
        private set;
    }
         
    private Pizza()
    {
        SizeDiameterCM = 25;
    }

    public static Pizza GetPizza()
    {
        return new Pizza();
    }

    public static Pizza GetLargePizza()
    {
        return new Pizza()
        {
            SizeDiameterCM = 35
        };
    }

    public static Pizza GetSmallPizza()
    {
        return new Pizza()
        {
            SizeDiameterCM = 28
        };
    }

    public override string ToString()
    {
        return String.Format("A Pizza with a diameter of {0} cm",SizeDiameterCM);
    }
}

Program.cs

class Program
{
    static void Main(string[] args)
    {
        var pizzaNormal = Pizza.GetPizza();
        var pizzaLarge = Pizza.GetLargePizza();
        var pizzaSmall = Pizza.GetSmallPizza();


        String pizzaString = String.Format("{0} and {1} and {2}",pizzaSmall.ToString(), pizzaNormal.ToString(), pizzaLarge.ToString());
        Console.WriteLine(pizzaString);
    }
}

Wynik

Pizza o średnicy 28 cm i Pizza o średnicy 25 cm i Pizza o średnicy 35 cm



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow