Design patterns
Статический заводский метод
Поиск…
Статический заводский метод
Мы можем предоставить содержательное имя для наших конструкторов.
Мы можем предоставить несколько конструкторов с тем же числом и типом параметров, что, как мы видели ранее, мы не можем сделать с конструкторами классов.
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() {...}
}
Прямой доступ к конструктору
Мы можем избежать прямого доступа к ресурсоемким конструкторам, например, для баз данных. public class 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);
//...
}
}
Статический заводский метод C #
Статический заводский метод - это вариация шаблона фабричного метода . Он используется для создания объектов без вызова конструктора самостоятельно.
Когда использовать метод Static Factory
- если вы хотите дать значащее имя методу, который генерирует ваш объект.
- если вы хотите избежать создания сверхкомплексного объекта, см. Tuple Msdn .
- если вы хотите ограничить количество созданных объектов (кеширование)
- если вы хотите вернуть объект любого подтипа возвращаемого типа.
Есть некоторые недостатки, такие как
- Классы без открытого или защищенного конструктора не могут быть инициализированы в статическом заводском методе.
- Статические заводские методы похожи на обычные статические методы, поэтому они не отличаются от других статических методов (это может варьироваться от IDE к IDE)
пример
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);
}
}
Выход
Пицца диаметром 28 см и пицца диаметром 25 см и пицца диаметром 35 см