Ricerca…


Metodo di fabbrica statico

Possiamo fornire un nome significativo per i nostri costruttori.

Possiamo fornire diversi costruttori con lo stesso numero e tipo di parametri, qualcosa che come abbiamo visto in precedenza non possiamo fare con i costruttori di classi.

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

Nascondere l'accesso diretto al costruttore

Possiamo evitare di fornire un accesso diretto a costruttori con risorse intensive, come per i database. classe pubblica 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);
     //...
   }
}

Metodo statico di fabbrica C #

Il metodo statico di fabbrica è una variazione del modello di metodo di fabbrica . È usato per creare oggetti senza dover chiamare personalmente il costruttore.

Quando utilizzare il metodo di produzione statica

  • se vuoi dare un nome significativo al metodo che genera il tuo oggetto.
  • se vuoi evitare la creazione di oggetti troppo complessi, vedi Tuple Msdn .
  • se si desidera limitare il numero di oggetti creati (memorizzazione nella cache)
  • se vuoi restituire un oggetto di qualsiasi sottotipo del loro tipo di ritorno.

Ci sono alcuni svantaggi come

  • Le classi senza un costruttore pubblico o protetto non possono essere inizializzate nel metodo statico di fabbrica.
  • I metodi di produzione statici sono come normali metodi statici, quindi non sono distinguibili da altri metodi statici (questo può variare da IDE a IDE)

Esempio

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

Produzione

Una pizza con un diametro di 28 cm e una pizza con un diametro di 25 cm e una pizza con un diametro di 35 cm



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow