반응형
규칙 1.생성자 대신 정적 팩토리 메소드를 사용할 수 없는지 생각해 보자
장점 1. 일반 생성자와 달리 정적 팩토리 메소드에는 이름이 있다.
- 생성자에 전달되는 인자는 어떤 객체가 생성되는지 설명하지 못하지만, 정적 팩토리 메소드의 이름을 잘 짓는다면 생성되는 객체가 어떤 객체인지 유추가 가능하다.
장점 2. 생성자와 달리 호출할때 마다 새로운 객체를 생성할 필요는 없다.
- 변경 불가능 클래스라면 , 미리 만들어둔 객체를 활용하거나 만든 객체를 캐시해 놓고재사용하여 같은 객체가 불필요하게 반복 생성되는 일을 피할 수 있다.
- 어떤 시점에 어떤 객체가 얼마나 존재할지를 정밀하게 제어할 수 있다(Instance-controlled class).
- 싱글톤 패턴을 따르도록 할 수 있고 객체 생성 불가능한 클래스를 만들 수도 있다.
장점 3. 생성자와는 달리 반환값 자료형의 하위 자료형 객체를 반환할 수 있다.
- public 으로 선언되지 않은 클래스의 객체를 반환하는 API를 만들 수 있다.(interface-based-framework)
- Interface based framework에서 interface는 정적 팩토리 메소드의 반환값 자료형으로 사용된다.
- 메소드에 주어지는 인자를 이용하면 어떤 클래스의 객체일지라도 동적으로 결정할 수 있다.
장점 4. 형인자 자료형(parameterized type) 객체를 만들 때 편하다.
- 기존의 경우 생성자를 호출할떄는, 설사 문맥상 형인자가 명백하더라도 반드시 인자로 형인자를 전달해야 한다. 따라서 보통 형인자는 두번 사용하게 된다.
Map<String, List<String>> m = new HashMap<String, List<String>>();
단점 1. Public이나 Protected로 선언된 생성자가 없으므로 하위 클래스를 만들 수 없다.
단점 2. 정적 팩토리 메소드가 다른 정적 메소드와 확연히 구분되지 않는다.
Java Class Diagram generate by intelli J
Source Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | package chapter02.item01; /** * Created by Jang Jeong Hyeon on 2017-08-03. */ public class Main { public static void main(String args[]) { // Providers would execute these lines Services.registerDefaultProvider(DEFAULT_PROVIDER); Services.registerProvider("comp",COMP_PROVIDER); Services.registerProvider("armed",ARMED_PROVIDER); // Clients would execute these lines Service defaultService = Services.newInstance(); // get default service in default provider Service compService = Services.newInstance("comp"); Service armedService = Services.newInstance("armed"); // test System.out.println("service 1 : "+defaultService); System.out.println("service 2 : "+compService); System.out.println("service 3 : "+armedService); } private static Provider DEFAULT_PROVIDER = new Provider() { public Service newService() { return new Service() { @Override public String toString() { return "Default Service"; } }; } }; private static Provider COMP_PROVIDER = new Provider() { public Service newService() { return new Service() { @Override public String toString() { return "Complementary service"; } }; } }; private static Provider ARMED_PROVIDER = new Provider() { public Service newService() { return new Service() { @Override public String toString() { return "Armed service"; } }; } }; } | cs |
Out Put
반응형
'Programming > Java' 카테고리의 다른 글
클래스 생성과 main 메소드 그리고 HelloWorld 출력 (0) | 2017.09.05 |
---|---|
[Effective-Java] Rule-02. 생성자 인자가 많을땐 Builder 패턴을 고려하라 (0) | 2017.08.10 |
자바란 무엇인가? (0) | 2016.09.18 |
01. Strategy Pattern (0) | 2016.08.29 |
response 객체 (0) | 2016.07.01 |