수색…


정적 팩터 리 방법

생성자에게 의미있는 이름을 제공 할 수 있습니다.

같은 수와 유형의 매개 변수를 가진 여러 생성자를 제공 할 수 있습니다. 앞서 살펴본 것처럼 클래스 생성자로는 할 수 없습니다.

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 {개인 정적 최종 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 #

static 팩토리 메소드팩토리 메소드 패턴의 변형입니다. 생성자를 직접 호출 할 필요없이 객체를 만드는 데 사용됩니다.

정적 팩터 리 방법 사용시기

  • 개체를 생성하는 메서드에 의미있는 이름을 지정하려는 경우
  • 오브젝트가 너무 많이 생성되는 것을 피하려면 Tuple Msdn을 참조하십시오.
  • 생성 된 객체의 수를 제한하려면 (캐싱)
  • 반환 유형의 하위 유형의 객체를 반환하려는 경우

다음과 같은 몇 가지 단점이 있습니다.

  • public 또는 protected 생성자가없는 클래스는 정적 팩토리 메서드에서 초기화 할 수 없습니다.
  • 정적 팩터 리 메서드는 일반적인 정적 메서드와 비슷하므로 다른 정적 메서드와 구별되지 않습니다 (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);
    }
}

산출

직경이 28cm 인 피자와 직경이 25cm 인 피자와 직경이 35cm 인 피자



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow