Hi

정적 팩토리 메소드, 빌더 패턴 본문

Programming/Java

정적 팩토리 메소드, 빌더 패턴

SharingWorld 2018. 4. 9. 15:38
스택을 만들어보자
package io.thethelab;

// 상속
// 다형성
// 오버라이딩
// 인터페이스

class Color {
	private int red;
	private int green;
	private int blue;

// RED, GREEN, BLUE, BLACK, CYAN
	private Color(int red, int green, int blue) {
		this.red = red;
		this.green = green;
		this.blue = blue;
	}

	static Color rgb(int red, int green, int blue) {
		return new Color(red, green, blue);
	}

	static Color hsb(int hue, int saturation, int brightness) {
		int red = 0;
		int green = 0;
		int blue = 0;
		return new Color(red, green, blue);
	}

/*
Color(int red) {}
Color(int green) {}
*/

// instance method: 객체를 생성해서 사용하는 것
// static(class) method: 객체를 생성하지 않고 사용하는 것
private static final Color RED = new Color(255, 0, 0);

static Color red() {
	return RED;
}

}

// 정적 팩토리 메소드(static factory method)
// Factory: 객체를 생성하는 역활

// => 생성자의 한계를 처리하기 위해 사용하는 설계 방법
// 1. 생성자의 이름은 변경이 불가능하다.
// 2. 생성자를 직접 이용할 경우, 캐시 같은 객체 생성에 관련된
// 최적화를 수행할 수 없다.
// 3. 생성자의 오버로딩은 한계가 있다.


public class Program_0226 {
	public static void main(String[] args) {
// Color c1 = new Color(255, 0, 0);
		Color c1 = Color.rgb(255, 0, 0);
		Color c3 = Color.hsb(255, 0, 0);
		Color c2 = Color.red();
	}
}


/*
// Builder -> Design Pattern
// => 생성자의 인자가 많을 경우, 빌더를 고려해라.

class User {
	private String name;
	private int age;
	private int height;
	private int weight;

	static class Builder {
		private String name;
		private int age;
		private int height;
		private int weight;

		Builder name(String name) {
			this.name = name;
			return this;
		}

		Builder age(int age) {
			this.age = age;
			return this;
		}

		Builder height(int height) {
			this.height = height;
			return this;
		}

		Builder weight(int weight) {
			this.weight = weight;
			return this;
		}

		User build() {
			return new User(this);
		}
	}

	private User(Builder b) {
		this.name = b.name;
		this.age = b.age;
		this.height = b.height;
		this.weight = b.weight;
	}


	public String toString() {
		return name + "(" + age + ")";
	}
}


public class Program_0226 {
	public static void main(String[] args) {
		User user = new User.Builder()
		.name("Tom")
		.age(42)
		.height(180)
		.weight(80).build();

// User user4 = new User("Tom", 42, 100, 120);


// System.out.println(user1);
	}
}
*/


/*
class User {
	private String name;
	private int age;
	private int height;
	private int weight;

	User() {
		this("Unnamed", 0, 0, 0);
	}

	User(String name) {
		this(name, 0, 0, 0);
	}

	User(String name, int age) {
		this(name, age, 0, 0);
	}

	User(String name, int age, int height) {
		this(name, age, height, 0);
	}

	User(String name, int age, int height, int weight) {
		this.name = name;
		this.age = age;
		this.height = height;
		this.weight = weight;
	}


	public String toString() {
		return name + "(" + age + ")";
	}
}

public class Program_0226 {
	public static void main(String[] args) {
		User user1 = new User();
		User user2 = new User("Tom");
		User user3 = new User("Tom", 42);
		User user4 = new User("Tom", 42, 100, 120);


		System.out.println(user1);
	}
}
*/

'Programming > Java' 카테고리의 다른 글

생성자  (0) 2018.04.09
private  (0) 2018.04.09
Library, Engine, Framework  (0) 2018.04.09
Clone() 과 공변의 룰  (0) 2018.04.09
enum  (0) 2018.04.09