サーチ…


静的ファクトリメソッド

私たちはコンストラクタに意味のある名前を付けることができます。

同じ数と型のパラメータを持つコンストラクタをいくつか用意することができます。これは先に見たように、クラスコンストラクタではできないものです。

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

コンストラクタへの直接アクセスを隠す

データベースのようなリソース集約型のコンストラクタへの直接アクセスを避けることができます。パブリッククラスDbConnection {プライベート静的final int MAX_CONNS = 100;プライベート静的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#

静的ファクトリメソッドファクトリメソッドパターンのバリエーションです。コンストラクタを自分で呼び出すことなくオブジェクトを作成するために使用されます。

静的ファクトリメソッドを使用する場合

  • あなたのオブジェクトを生成するメソッドに意味のある名前を付ける場合。
  • オーバーコンプレックスオブジェクトの作成を避けたい場合は、 Tuple Msdnを参照してください。
  • 作成されるオブジェクトの数を制限したい場合(キャッシング)
  • 戻り値の型の任意のサブタイプのオブジェクトを返す場合

のようないくつかの欠点があります

  • パブリックまたは保護されたコンストラクタのないクラスは、静的ファクトリメソッドでは初期化できません。
  • 静的ファクトリメソッドは通常の静的メソッドと似ているため、他の静的メソッドと区別できません(これは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);
    }
}

出力

直径28cmのピザと直径25cmのピザと直径35cmのピザ



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow