Поиск…


Статический заводский метод

Мы можем предоставить содержательное имя для наших конструкторов.

Мы можем предоставить несколько конструкторов с тем же числом и типом параметров, что, как мы видели ранее, мы не можем сделать с конструкторами классов.

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 см



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow