[java] 정적 팩토리 메소드 란 무엇입니까?

“정적 팩토리”방법은 무엇입니까?



답변

데이터베이스 연결은 리소스를 많이 사용하기 때문에 데이터베이스 연결에 직접 액세스 할 수 없습니다. 따라서 우리 getDbConnection가 한계 미만이면 연결을 만드는 정적 팩토리 메소드 를 사용합니다. 그렇지 않으면 “예비”연결을 제공하려고하지만 예외가 없으면 실패합니다.

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


답변

정적 팩토리 메소드 패턴 캡슐 오브젝트 작성하는 방법이다. 팩토리 메소드가 없으면 클래스의 생성자를 직접 호출하면 됩니다 Foo x = new Foo(). 이 패턴을 사용하면 팩토리 메소드를 대신 호출합니다 Foo x = Foo.create(). 생성자는 private으로 표시되므로 클래스 내부를 제외하고는 호출 할 수 없으며 팩토리 메소드는 static먼저 객체가 없어도 호출 할 수 있도록 표시됩니다 .

이 패턴에는 몇 가지 장점이 있습니다. 하나는 팩토리가 많은 서브 클래스 (또는 인터페이스의 구현 자) 중에서 선택하여이를 리턴 할 수 있다는 것입니다. 이런 식으로 호출자는 잠재적으로 복잡한 클래스 계층을 알거나 이해할 필요없이 매개 변수를 통해 원하는 동작을 지정할 수 있습니다.

Matthew와 James가 지적했듯이 연결과 같은 제한된 리소스에 대한 액세스를 제어하는 ​​또 다른 이점이 있습니다. 이 방법 은 재사용 가능한 객체의 풀 을 구현하는 방법 입니다. 객체를 생성 , 사용 및 분해하는 대신 구성 및 파괴가 고가의 프로세스 인 경우 한 번 구축하여 재활용하는 것이 더 합리적입니다. 팩토리 메소드는 기존의 사용되지 않는 인스턴스화 된 오브젝트가있는 경우이를 리턴하거나 오브젝트 수가 임계 값보다 낮은 null경우이를 생성 하거나 예외를 발생 시키거나 상위 임계 값을 초과하면 리턴 할 수 있습니다.

Wikipedia의 기사에 따르면 여러 팩토리 메소드는 유사한 인수 유형에 대한 다른 해석을 허용합니다. 일반적으로 생성자는 클래스와 이름이 동일하므로 주어진 서명을 가진 생성자를 하나만 가질 수 있습니다 . 팩토리는 제한이 없으므로 동일한 인수 유형을 허용하는 두 가지 다른 메소드를 가질 수 있습니다.

Coordinate c = Coordinate.createFromCartesian(double x, double y)

Coordinate c = Coordinate.createFromPolar(double distance, double angle)

Rasmus가 지적한 것처럼 가독성을 향상시키는 데에도 사용할 수 있습니다.


답변

노트! ” 정적 팩토리 메소드팩토리 메소드 패턴 과 동일 하지 않습니다 “(c) Effective Java, Joshua Bloch.

팩토리 메소드 : “객체를 생성하기위한 인터페이스를 정의하지만 인터페이스를 구현하는 클래스가 인스턴스화 할 클래스를 결정하게합니다. 팩토리 메소드는 클래스가 서브 클래스에 대한 인스턴스화를 연기하게합니다”(c) GoF.

“정적 팩토리 메소드는 단순히 클래스의 인스턴스를 리턴하는 정적 메소드입니다.” (c) 효과적인 Java, Joshua Bloch. 일반적으로이 메소드는 특정 클래스 내에 있습니다.

차이점:

정적 팩토리 메소드의 핵심 아이디어는 객체 생성을 제어하고 생성자에서 정적 메소드로 위임하는 것입니다. 생성 될 객체의 결정은 메소드 외부에서 만들어진 추상 팩토리 (일반적인 경우는 아니지만)에서와 같습니다. Factory Method의 핵심 (!) 아이디어는 Factory Method 내에서 생성 할 클래스의 인스턴스에 대한 결정을 위임하는 것입니다. 예를 들어 고전적인 Singleton 구현은 정적 팩토리 메소드의 특별한 경우입니다. 일반적으로 사용되는 정적 팩토리 메소드의 예 :

  • valueOf
  • getInstance
  • newInstance

답변

정적 팩토리 메소드로 가독성을 향상시킬 수 있습니다.

비교

public class Foo{
  public Foo(boolean withBar){
    //...
  }
}

//...

// What exactly does this mean?
Foo foo = new Foo(true);
// You have to lookup the documentation to be sure.
// Even if you remember that the boolean has something to do with a Bar
// you might not remember whether it specified withBar or withoutBar.

public class Foo{
  public static Foo createWithBar(){
    //...
  }

  public static Foo createWithoutBar(){
    //...
  }
}

// ...

// This is much easier to read!
Foo foo = Foo.createWithBar();


답변

  • 코드를 명확히 할 수있는 생성자와 달리 이름이 있습니다.
  • 호출 할 때마다 새 객체를 만들 필요가 없습니다. 필요한 경우 객체를 캐시하고 재사용 할 수 있습니다.
  • 반환 유형의 하위 유형을 반환 할 수 있습니다. 특히 구현 클래스가 호출자에게 알려지지 않은 개체를 반환 할 수 있습니다. 이것은 인터페이스를 정적 ​​팩토리 메소드의 리턴 유형으로 사용하는 많은 프레임 워크에서 매우 유용하고 널리 사용되는 기능입니다.

에서 http://www.javapractices.com/topic/TopicAction.do?Id=21


답변

그것은 모두 유지 보수성으로 귀결됩니다. 이것을 넣는 가장 좋은 방법은 new키워드를 사용하여 객체를 만들 때마다 구현하는 코드를 연결하는 것입니다.

팩토리 패턴을 사용하면 객체를 만드는 방식과 객체를 만드는 방식을 분리 할 수 ​​있습니다. 생성자를 사용하여 모든 객체를 만들면 본질적으로 객체를 사용하는 코드를 해당 구현에 연결해야합니다. 객체를 사용하는 코드는 해당 객체에 “종속”됩니다. 이것은 표면 상 큰 문제가 아닌 것처럼 보일 수 있지만 객체가 변경 될 때 (생성자의 서명을 변경하거나 객체를 서브 클래 싱하는 것을 고려할 때) 돌아가서 모든 곳에서 사물을 다시 연결해야합니다.

오늘날 공장은 자체 유지하기가 약간 어려운 보일러 플레이트 코드가 많이 필요하기 때문에 Dependency Injection을 선호하여 크게 솔질되었습니다. Dependency Injection은 기본적으로 팩토리와 동일하지만 구성 또는 주석을 통해 객체를 선언적으로 연결하는 방법을 지정할 수 있습니다.


답변

클래스의 생성자가 private 인 경우 클래스 외부에서 클래스의 객체를 만들 수 없습니다.

class Test{
 int x, y;
 private Test(){
  .......
  .......
  }
}

우리는 클래스 외부에서 객체를 만들 수 없습니다. 따라서 클래스 외부에서 x, y에 액세스 할 수 없습니다. 그렇다면이 수업의 용도는 무엇입니까?
답변 : FACTORY 메소드 는 다음과 같습니다 .
위 클래스에서 아래 메소드를 추가하십시오.

public static Test getObject(){
  return new Test();
}

이제 외부에서이 클래스에 대한 객체를 만들 수 있습니다. 길처럼 …

Test t = Test.getObject();

따라서 개인 생성자를 실행하여 클래스의 객체를 반환하는 정적 메서드를 FACTORY 메서드 라고
합니다.