Design patterns
Statisk fabriksmetod
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