Sök…


Statisk fabriksmetod

Vi kan ge ett meningsfullt namn för våra konstruktörer.

Vi kan tillhandahålla flera konstruktörer med samma antal och typ av parametrar, något som vi såg tidigare inte kan göra med klasskonstruktörer.

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() {...}
}

Gömmer direkt åtkomst till konstruktören

Vi kan undvika att ge direkt tillgång till resurskrävande konstruktörer, till exempel för databaser. public class DbConnection {privat statisk slutlig int MAX_CONNS = 100; privata statiska int totala anslutningar = 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);
     //...
   }
}

Statisk fabriksmetod C #

Den statiska fabriksmetoden är en variant av fabriksmetodens mönster. Det används för att skapa objekt utan att behöva ringa konstruktören själv.

När du använder Static Factory Method

  • om du vill ge ett meningsfullt namn på metoden som genererar ditt objekt.
  • Om du vill undvika skapande av överkomplex objekt se Tuple Msdn .
  • om du vill begränsa antalet skapade objekt (cache)
  • om du vill returnera ett objekt av någon subtyp av deras returtyp.

Det finns några nackdelar som

  • Klasser utan offentlig eller skyddad konstruktör kan inte initialiseras med den statiska fabriksmetoden.
  • Statiska fabriksmetoder är som vanliga statiska metoder, så de kan inte skiljas från andra statiska metoder (detta kan variera från IDE till IDE)

Exempel

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);
    }
}

Produktion

En pizza med en diameter på 28 cm och en Pizza med en diameter på 25 cm och en Pizza med en diameter på 35 cm



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow