1. 종류

1.1. Singleton

class SingleTon {
	static final SingleTon instance = new SingleTon();
	private SingleTon() {
		// 초기화
	}
	public SingleTon getInstance() {
		return instance;
	}
}

public class TestCode {
	public static void main(String[] args) {
		SingleTon a = SingleTon.getInstance();
		SingleTon b = SingleTon.getInstance();
		System.out.println(a == b); // true
	}
}

1.2. Builder

class Something {
	private Something(String name, int size) {
		// 초기화
	}

	public static class Builder {
		String name = null;
		int size = 0;
		public Builder() {
			// 초기화
		}
		public Builder setName(String name) {
			this.name = name;
			return this;
		}
		public Builder setSize(int size) {
			this.size = size;
			return this;
		}
		public Something build() {
			return new Something(name, size);
		}
	}
}

// 예시 소스
public void createSomething() {
	Something something = new Something.Builder().setName("hj").setSize(1).build();
}

1.3. Factory

abstract class Unit {
	public abstract String getVoice();
}

class UnitFatory {
	public static Unit getUnit(String unitName) {
		if ("marine".equalsIgnoreCase(unitName)) return new Marine();
		else if ("zealot".equalsIgnoreCase(unitName)) return new Zealot();
		else return new Zergling();
	}
}

class Marine extends Unit {
	public Marine() {}
	public String getVoice() { return "You wanna piece of me, boy?" }
}
class Zealot extends Unit {
	public Zealot() {}
	public String getVoice() { return "My life for Aiur!" }
}
class Zergling extends Unit {
	public Zergling() {}
	public String getVoice() { return "!@#$$%^&*&^#$%*" }
}

public class TestCode {
	public static void main(String[] args) {
		Unit unit1 = UnitFatory.getUnit("Marine");
		Unit unit2 = UnitFatory.getUnit("zzealot");
		System.out.println(unit1.getVoice()); // You wanna piece of me, boy?
		System.out.println(unit2.getVoice()); // !@#$$%^&*&^#$%*
	}
}