정적 공장 출하시 방법이란 무엇입니까?
정적 공장(static factory) 방식이 무엇입니까?
static factory 메서드 패턴은 오브젝트 작성을 캡슐화하는 방법입니다.공장 메서드 없이 클래스의 컨스트럭터에 직접 전화하기만 하면 됩니다.Foo x = new Foo()
방법을 대신 Foo x = Foo.create()
컨스트럭터는 프라이빗 마크가 붙어 있기 때문에 클래스 내부 이외에는 호출할 수 없고, 공장 메서드는 오브젝트를 가지지 않고 호출할 수 있도록 마크되어 있습니다.
이 패턴에는 몇 가지 장점이 있습니다.하나는 공장에서는 많은 서브클래스(또는 인터페이스의 실장자)에서 선택하여 반환할 수 있다는 것입니다.이것에 의해, 발신자는, 복잡한 클래스 계층을 파악하거나 이해할 필요 없이, 파라메타를 사용해 필요한 동작을 지정할 수 있습니다.
또 다른 장점은 Matthew와 James가 지적했듯이 연결과 같은 제한된 리소스에 대한 액세스를 제어할 수 있다는 것입니다.이는 재사용 가능한 오브젝트 풀을 구현하는 방법입니다.개체를 구축, 사용 및 해체하는 대신 구축 및 파괴에 비용이 많이 드는 프로세스라면 한 번 구축한 후 재활용하는 것이 더 합리적일 수 있습니다.공장 메서드는 사용되지 않은 기존 인스턴스화된 개체가 있으면 반환하거나 개체 수가 하위 임계값보다 낮은 경우 인스턴스화된 개체를 생성하거나 예외를 발생시키거나 반환할 수 있습니다.null
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
위키피디아에 관한 기사에 따르면, 여러 공장 방법은 유사한 주장 유형에 대한 다른 해석을 가능하게 한다.일반적으로 생성자의 이름은 클래스와 동일합니다. 즉, 지정된 시그니처를 가진 생성자는 하나만 있을 수 있습니다.팩토리에는 그다지 제약이 없습니다.즉, 같은 인수 타입을 받아들이는2개의 다른 방법을 사용할 수 있습니다.
Coordinate c = Coordinate.createFromCartesian(double x, double y)
그리고.
Coordinate c = Coordinate.createFromPolar(double distance, double angle)
이것은 Rasmus가 지적한 것처럼 가독성을 향상시키기 위해서도 사용할 수 있습니다.
메모! "static factory method는 Factory method 패턴과 동일하지 않습니다." (c) Effective Java, Joshua Bloch.
공장 출하 시 메서드: "개체를 만들기 위한 인터페이스를 정의하지만 인터페이스를 구현하는 클래스가 인스턴스화할 클래스를 결정합니다.Factory 메서드에서는 클래스가 서브클래스로 인스턴스화를 연기할 수 있습니다." (c) GoF.
"Static factory 메서드는 클래스의 인스턴스를 반환하는 정적 메서드입니다." (c) 효과적인 자바, 조슈아 블로흐.보통 이 메서드는 특정 클래스 내에 있습니다.
차이점은 다음과 같습니다.
스태틱 팩토리 방식의 주요 아이디어는 객체 생성을 제어하고 컨스트럭터에서 스태틱 방식으로 위임하는 것입니다.생성할 객체의 결정은 메서드 외부에서 이루어지는 Abstract Factory와 같습니다(일반적이지만 항상 그렇지는 않습니다).Factory Method(!)의 주요 개념은 Factory Method 내에 작성할 클래스의 인스턴스 결정을 위임하는 것입니다.예: 클래식한 Singleton 구현은 정적 공장 방법의 특별한 경우입니다.일반적으로 사용되는 스태틱팩토리 방법의 예:
- 값
- get Instance(인스턴스
- newInstance
데이터베이스 접속은 자원을 많이 사용하기 때문에 직접 접속하는 것은 피합니다.합니다.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);
//...
}
}
공장 출하 시 정적 방법으로 가독성을 향상시킬 수 있습니다.
비교하다
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();
- 코드를 명확하게 할 수 있는 컨스트럭터와 달리 이름이 있습니다.
- 호출할 때마다 새 개체를 생성할 필요가 없습니다. 필요한 경우 개체를 캐시하고 재사용할 수 있습니다.
- 는 반환 타입의 서브 타입을 반환할 수 있습니다.특히 구현 클래스를 알 수 없는 오브젝트를 발신자에게 반환할 수 있습니다.이는 스태틱팩토리 방식의 반환 유형으로 인터페이스를 사용하는 많은 프레임워크에서 매우 유용하고 널리 사용되는 기능입니다.
from http://www.javapractices.com/topic/TopicAction.do?Id=21
이 모든 것은 유지보수로 귀결됩니다. 을 입니다.new
키워드를 사용하여 객체를 만듭니다.작성하고 있는 코드를 구현에 결합합니다.
공장 패턴을 사용하면 개체를 생성하는 방법과 개체를 사용하여 수행하는 작업을 구분할 수 있습니다.컨스트럭터를 사용하여 모든 개체를 생성할 경우 기본적으로 해당 구현에 개체를 사용하는 코드를 하드 배선으로 연결합니다.개체를 사용하는 코드는 해당 개체에 "의존"합니다.겉으로 보기에는 별거 아닌 것처럼 보이지만 오브젝트가 변경되면(컨스트럭터의 시그니처를 변경하거나 오브젝트의 서브클래싱을 생각할 때) 모든 것을 다시 배선해야 합니다.
오늘날 공장들은 의존성 주입을 사용하는 것에 대해 대부분 거부되어 왔습니다. 왜냐하면 공장들은 보일러 플레이트 코드를 많이 필요로 하기 때문입니다.Dependency Injection은 기본적으로 팩토리와 동일하지만 구성 또는 주석을 통해 객체를 선언적으로 연결하는 방법을 지정할 수 있습니다.
클래스의 생성자가 개인인 경우 클래스 외부에서 클래스의 개체를 만들 수 없습니다.
class Test{
int x, y;
private Test(){
.......
.......
}
}
위 클래스에 대한 개체를 외부에서 만들 수 없습니다.따라서 클래스 외부에서 x, y에 액세스할 수 없습니다.그럼 이 수업이 무슨 소용이에요?
다음은 Answer : Factory 메서드입니다.
위 클래스에 아래 메서드를 추가합니다.
public static Test getObject(){
return new Test();
}
이제 클래스 외부에서 이 클래스의 개체를 만들 수 있습니다.그 방법처럼...
Test t = Test.getObject();
따라서 프라이빗 컨스트럭터를 실행하여 클래스의 오브젝트를 반환하는 정적 메서드를 FOCTORY 메서드라고 부릅니다.
.
제가 알고 있는 이 글에 빛을 더해야겠다고 생각했습니다.우리는 이 기술을 우리 회사에서 광범위하게 사용했다.recent android project
대신creating objects using new operator
를 사용할 수도 있습니다.static method
수업을 인스턴스화합니다.코드 리스트:
//instantiating a class using constructor
Vinoth vin = new Vinoth();
//instantiating the class using static method
Class Vinoth{
private Vinoth(){
}
// factory method to instantiate the class
public static Vinoth getInstance(){
if(someCondition)
return new Vinoth();
}
}
스태틱 메서드는 조건부 객체 작성을 지원합니다.생성자를 호출할 때마다 객체가 생성되지만 원하지 않을 수 있습니다.어떤 조건을 체크하고 나서만 새 객체를 생성한다고 가정합니다.조건이 충족되지 않는 한 매번 Vinoth의 새 인스턴스를 생성할 수 없습니다.
또 다른 예는 Effective Java에서 가져온 것입니다.
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
이 메서드는 부울 프리미티브 값을 부울 객체 참조로 변환합니다.그Boolean.valueOf(boolean)
method는 오브젝트를 생성하지 않는다는 것을 보여줍니다.의 static factory methods
하여 되돌리다invocations
를 사용하면 클래스는 언제든지 존재하는 인스턴스를 엄격하게 제어할 수 있습니다.
Static factory methods
즉, 다른 것과 달리constructors
할 수 .object
것이든subtype
반품 타입입니다.API는 클래스를 공개하지 않고 객체를 반환할 수 있습니다.이러한 방식으로 구현 클래스를 숨기면 매우 컴팩트한 API가 생성됩니다.
Calendar Calendar.getInstance()가 됩니다.BuddhistCalendar
,JapaneseImperialCalendar
" " " " 1 "Georgian
.
제가 생각할 수 있는 또 다른 예는Singleton pattern
인 컨스트럭터를 getInstance
사용 가능한 인스턴스는 항상 1개뿐임을 확인하는 방법입니다.
public class Singleton{
//initailzed during class loading
private static final Singleton INSTANCE = new Singleton();
//to prevent creating another instance of Singleton
private Singleton(){}
public static Singleton getSingleton(){
return INSTANCE;
}
}
팩토리 메서드는 객체의 인스턴스화를 추상화하는 메서드입니다.일반적으로 팩토리는 일부 인터페이스를 구현하는 클래스의 새로운 인스턴스가 필요하다는 것을 알고 있지만 구현 클래스를 모르는 경우에 유용합니다.
이것은 관련 클래스의 계층에 대해 작업할 때 도움이 됩니다.그 좋은 예로는 GUI 툴킷을 들 수 있습니다.각 위젯의 구체적인 구현을 위해 컨스트럭터에 대한 콜을 하드 코드화하는 것만으로 충분하지만, 툴킷을 다른 툴킷으로 교환하고 싶다면 변경할 곳이 많습니다.팩토리를 사용하면 변경해야 할 코드의 양을 줄일 수 있습니다.
Static 팩토리에서 얻을 수 있는 장점 중 하나는 API가 클래스를 공개하지 않고 객체를 반환할 수 있다는 것입니다.이를 통해 매우 컴팩트한 API가 실현됩니다.Java에서 이것은 Collections 클래스에 의해 실현됩니다.Collections 클래스는 약 32개의 클래스를 숨깁니다.Collection API는 매우 컴팩트합니다.
프라이빗 컨스트럭터를 사용한 스태틱팩토리 메서드의 장점 중 하나는 인스턴스 제어 클래스를 만들 수 있다는 것입니다(인스턴스가 외부에서 생성되지 않도록 하려면 외부 클래스에 대해 객체 작성이 제한되어야 합니다).또한 인스턴스 제어 클래스는 프로그램 실행 중에 동일한 두 개의 개별 인스턴스가 존재하지 않음을 보증합니다(a.disclass(b)). 이는 Effective java에 따르면 동일한 메서드 대신 == 연산자와 객체의 동일성을 확인할 수 있음을 의미합니다.
반복 호출에서 동일한 개체를 반환하는 정적 팩토리 메서드를 사용하면 클래스는 언제든지 존재하는 인스턴스를 엄격하게 제어할 수 있습니다.이를 수행하는 클래스는 인스턴스 제어라고 합니다.인스턴스 제어 클래스를 작성해야 하는 이유는 여러 가지가 있습니다.인스턴스 제어를 통해 클래스는 싱글톤(항목 3) 또는 비인스턴트(항목 4)임을 보증할 수 있습니다.또한, 불변의 클래스(항목 15)는 a==b인 경우 및 a==b인 경우에만 두 개의 동일한 인스턴스가 존재하지 않음을 보증할 수 있습니다.클래스가 이 보증을 하면 클라이언트는 equals(Object) 메서드 대신 == 연산자를 사용할 수 있으므로 성능이 향상될 수 있습니다.Enum 타입(항목 30)은 이 보증을 제공합니다.
효과적인 자바에서 조슈아 블로치(항목 1, 6페이지)
스태틱 팩토리 방식은 사용할 콘크리트 클래스를 1개의 인스턴스만 반환하는 경우에 적합합니다.
예를 들어 데이터베이스 접속 클래스에서 데이터베이스 접속을 1개의 클래스만 작성하도록 할 수 있습니다.그러면 Mysql에서 Oracle로 전환할 경우 한 클래스의 로직을 변경하기만 하면 나머지 애플리케이션은 새로운 접속을 사용할 수 있습니다.
데이터베이스 풀링을 실장하는 경우는, 애플리케이션의 나머지 부분에도 영향을 주지 않고, 실장할 수 있습니다.
이 기능을 사용하면, 목적의 공장에서의 변경으로부터 애플리케이션의 나머지를 보호할 수 있습니다.
정적인 이유는 제한된 리소스(소켓 연결 수 또는 파일 핸들 수)를 추적하는 경우 이 클래스가 전달 및 반환된 수를 추적할 수 있기 때문에 제한된 리소스가 소진되지 않습니다.
Java 구현에는 유틸리티 클래스 java.util이 포함되어 있습니다.어레이 및 java.util.두 컬렉션 모두 스태틱팩토리 메서드, 그 예 및 사용 방법을 포함하고 있습니다.
Arrays.asList("1","2","3")
Collections.synchronizedList(..), Collections.emptyList(), Collections.unmodifiableList(...)
(일부 예만 mor 메서드의 javadocs를 체크할 수 있습니다.예:https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html)
java.lang도.문자열 클래스에는 다음과 같은 스태틱팩토리 메서드가 있습니다.
String.format(...), String.valueOf(..), String.copyValueOf(...)
정적인
멤버가 'static' 키워드로 선언했습니다.
공장법
새 개체를 만들고 반환하는 메서드입니다.
자바어
프로그래밍 언어는 'static'의 의미와 관련이 있지만 'factory'의 정의와는 관련이 없습니다.
언급URL : https://stackoverflow.com/questions/929021/what-are-static-factory-methods
'sourcecode' 카테고리의 다른 글
vim에서 C 코드를 자동 포맷/인디트하려면 어떻게 해야 합니까? (0) | 2022.08.21 |
---|---|
JVM을 원격으로 디버깅할 수 있도록 설정하는 Java 명령줄 옵션은 무엇입니까? (0) | 2022.08.21 |
vue js 또는 jquery를 사용하여 요소의 개체 바꾸기 (0) | 2022.08.19 |
모든 액션 Vuex 전 콜 변환 (0) | 2022.08.19 |
이 종속성을 찾을 수 없습니다(TypeScript, Vue). (0) | 2022.08.19 |