์ดํํฐ๋ธ ์๋ฐ๋ฅผ ํตํด ์๋ฐ๋ฅผ ์กฐ๊ธ ๋ ๊น๊ฒ ๊ณต๋ถํด๋ณด๊ณ ์ ํ๋ค. ํผ์์ ์ฝ๊ณ ์ ๋ฆฌํ๋ฉด์ ๊ณต๋ถํ๋ ค๊ณ ํ์ง๋ง ์๊ฐ๋ณด๋ค ์ฑ ์ด ์ด๋ ต๋ค. ๊ทธ๋์ ๋ฐฑ๊ธฐ์ ๋์ '์ดํํฐ๋ธ ์๋ฐ ์๋ฒฝ ๊ณต๋ต' ์๋ฆฌ์ฆ(์ด 5๋ถ) ๊ฐ์๋ฅผ ๋ค์ผ๋ฉด์ ๊ณต๋ถํ๋ ค๊ณ ํ๋ค. ํน์๋ ํด๋น ๋ธ๋ก๊ทธ์์ ์ดํด๊ฐ ๋์ง ์๋ ๋ถ๋ถ์ด ์๋ค๋ฉด ๋ฐฑ๊ธฐ์ ๋์ ๊ฐ์๋ฅผ ์ ๊ทน ์ถ์ฒํ๋ค.
'2์ฅ ๊ฐ์ฒด ์์ฑ๊ณผ ํ๊ดด'์ ์ฒซ ๋ฒ์งธ ์์ดํ ์ผ๋ก '์์ฑ์ ๋์ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ๊ณ ๋ คํ๋ผ'๋ผ๋ ๊ฒ์ ์๊ฐํ๊ณ ์๋ค. ํด๋ผ์ด์ธํธ๊ฐ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ป๋ ์ ํต์ ์ธ ์๋จ์ผ๋ก public ์์ฑ์๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ์์ง๋ง ์๋์ ๊ฐ์ด ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ก๋ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ป์ ์ ์๋ค.
public class Order{
public static Order OrderByStaticFactoryMethod(){
Order order = new Order();
return order;
}
}
์ฌ๊ธฐ์ ์ค์ํ ์ ์ public ์์ฑ์๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ ๋์ ๋ฌด์กฐ๊ฑด ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ผ๋ ๊ฒ์ ์๋๋ค. ๊ฐ์์ ์ฐ์์๊ฐ ์์ผ๋ ์ฅ๋จ์ ์ ์ดํดํ๊ณ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค๊ณ ๋งํ๊ณ ์๋ค. (๋ฌด์์ public ์์ฑ์๋ฅผ ์ ๊ณตํ๋ ์ต๊ด์ด ์๋ค๋ฉด ๊ฐ์ด ๊ณ ์ณ๋๊ฐ๋๋ก ํ์!!) ๊ทธ๋ฌ๋ฉด ์ด์ ๋ถํฐ ์ฅ์ 5๊ฐ์ง์ ๋จ์ 2๊ฐ์ง์ ๋ํด์ ์ดํด๋ณด์.
์ฅ์ 1. ์ด๋ฆ์ ๊ฐ์ง ์ ์๋ค.
public ์์ฑ์๋ฅผ ์ด์ฉํ๋ ๊ฒฝ์ฐ class์ ์ด๋ฆ๊ณผ ๊ฐ์ ์์ฑ์๋ฅผ ์ฌ์ฉํ ์๋ฐ์ ์๋ค. ํ์ง๋ง ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ฐํ๋ ๊ฐ์ฒด์ ํน์ฑ์ ์ฝ๊ฒ ๋ฌ์ฌํ ์ ์๋ ์ด๋ฆ์ ์ง์ ์ ์๋ค.
public class Order{
private boolean prime;
private boolean urgent;
private Product product;
public static Order primeOrder(Product product){
Order order = new Order();
this.prime = true;
order.product = product;
return order;
}
public static Order urgentOrder(Product product){
Order order = new Order();
order.urgent = true;
order.product = product;
return order;
}
}
์ฅ์ 2. ํธ์ถ๋ ๋๋ง๋ค ์ธ์คํด์ค๋ฅผ ์๋ก ์์ฑํ์ง๋ ์์๋ ๋๋ค.
public class Settings{
private static final Settings SETTINGS = new Settings();
private Settings(){}
public static Settings getInstance(){
return SETTINGS;
}
}
์์ ์ฝ๋์์ ์ ์ ์๋ ๊ฒ์ฒ๋ผ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ๊ณ์ํด์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ง์ ์ ์๋ค. ์ด ๋ง์ ๊ฐ์ฒด ์์ฑ์ ํด๋น ํด๋์ค๊ฐ ์ปจํธ๋กคํ๋ค๋ ๊ฑธ๋ก๋ ๋ณผ ์ ์๋ค. ์ด ๋๋ถ์ ๋ถ๋ณ ํด๋์ค๋ ์ธ์คํด์ค๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋๊ฑฐ๋ ์๋ก ์์ฑํ ์ธ์คํด์ค๋ฅผ ์บ์ฑํ์ฌ ์ฌํ์ฉํ๋ ์์ผ๋ก ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ํผํ ์ ์๋ค.
์ฅ์ 3. ๋ฐํ ํ์ ์ ํ์ ํ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์๋ ๋ฅ๋ ฅ์ด ์๋ค.
์ด ๋ฅ๋ ฅ์ ๋ฐํํ ๊ฐ์ฒด์ ํด๋์ค๋ฅผ ์์ ๋กญ๊ฒ ์ ํํ ์ ์๊ฒ ํ๋ ์์ฒญ๋ ์ ์ฐ์ฑ์ ์ ๊ณตํ๋ค. ์ด๋ ๊ตฌ์ฒด์ ์ธ ํ์ ์ ํด๋ผ์ด์ธํธ์๊ฒ ์จ๊ธธ ์ ์๊ณ , API๋ฅผ ๋ง๋ค ๋ ์ด ์ ์ฐ์ฑ์ ์์ฉํ๋ฉด ๊ตฌํ ํด๋์ค๋ฅผ ๊ณต๊ฐํ์ง ์๊ณ ๋ ๊ทธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์์ด API๋ฅผ ์๊ฒ ์ ์งํ ์ ์๋ค.
public class HelloServiceFactory{
public static HelloService of(String lang){
if(lang.equals("ko"){
return new KoreanHelloService();
} else {
return new EnglishHelloService();
}
}
}
์ฅ์ 4. ์ ๋ ฅ ๋งค๊ฐ๋ณ์์ ๋ฐ๋ผ ๋งค๋ฒ ๋ค๋ฅธ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์๋ค.
๋ฐํ ํ์ ์ ํ์ ํ์ ์ด๊ธฐ๋ง ํ๋ฉด ์ด๋ค ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ์๊ด์๋ค. ์๋ฅผ ๋ค์ด, EnumSet ํด๋์ค๋ ์์๊ฐ 64๊ฐ ์ดํ๋ฉด ์์๋ค์ long ๋ณ์ ํ๋๋ก ๊ด๋ฆฌํ๋ RegularEnumSet์ ์ธ์คํด์ค๋ฅผ, 65๊ฐ ์ด์์ด๋ฉด long ๋ฐฐ์ด๋ก ๊ด๋ฆฌํ๋ JumboEnumSet์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค.
ํด๋ผ์ด์ธํธ๋ ํฉํฐ๋ฆฌ๊ฐ ๊ฑด๋ค์ฃผ๋ ๊ฐ์ฒด๊ฐ ์ด๋ ํด๋์ค์ ์ธ์คํด์ค์ธ์ง ์ ์๋ ์๊ณ ์ ํ์๋ ์๋ค. EnumSet์ ํ์ ํด๋์ค์ด๊ธฐ๋ง ํ๋ฉด ๋๋ ๊ฒ์ด๋ค.
์ฅ์ 5. ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์์ฑํ๋ ์์ ์๋ ๋ฐํํ ๊ฐ์ฒด์ ํด๋์ค๊ฐ ์กด์ฌํ์ง ์์๋ ๋๋ค.
์ด๊ฒ์ ์๋น์ค ์ ๊ณต์ ํ๋ ์์ํฌ๋ฅผ ๋ง๋๋ ๊ทผ๊ฐ์ด ๋๋ค. ๋ํ์ ์ธ ์๋น์ค ์ ๊ณต์ ํ๋ ์์ํฌ๋ก๋ JDBC(Java Database Connectivity)๊ฐ ์๋ค. ์ฆ, ์ด๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ์ง ๋ชจ๋ฅด๋ ์ํ์์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
๋จ์ 1. ์์์ ํ๋ ค๋ฉด public์ด๋ protected ์์ฑ์๊ฐ ํ์ํ๋ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ง ์ ๊ณตํ๋ฉด ํ์ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋ค.
public class Settings{
private static final Settings SETTINGS = new Settings();
private Settings(){}
public static Settings getInstance(){
return SETTINGS;
}
}
์์ ๊ฒฝ์ฐ์ฒ๋ผ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ง์ ์ ๊ณตํ๋ฉด ์์ฑ์๋ฅผ private๋ก ์ค์ ํ๋ค. ์์์ ํ๋ ค๋ฉด public์ด๋ protected ์์ฑ์๊ฐ ํ์ํ๋ฏ๋ก ์ด ๊ฒฝ์ฐ์๋ ์์์ ํ์ง ๋ชปํ๊ฒ ๋๋ค. (์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ์์ฑ์๋ฅผ public์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์์)
๋จ์ 2. ์ ์ ํํฐ๋ฆฌ ๋ฉ์๋๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ฐพ๊ธฐ ์ด๋ ต๋ค.
์์ฑ์์ฒ๋ผ API ์ค๋ช (JavaDoc)์ ๋ช ํํ ๋๋ฌ๋์ง ์์ผ๋ ์ฌ์ฉ์๋ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋ ๋ฐฉ์ ํด๋์ค๋ฅผ ์ธ์คํด์คํํ ๋ฐฉ๋ฒ์ ์์๋ด์ผ ํ๋ค. ์์ฑ์๊ฐ ์๊ณ ์ ์ ํํฐ๋ฆฌ ๋ฉ์๋๋ง ์๋ค๋ฉด Constructors ๋ถ๋ถ(JavaDoc์์ ์ ๊ณตํ๋ ๊ฒ)์ด ์์ด์ง๊ณ , ๋ง์ฝ ๋ฉ์๋๊ฐ ๋ง์์ง๋ค๋ฉด ์ธ์คํด์ค๋ฅผ ์์ฑํด์ฃผ๋ ๋ฉ์๋๋ฅผ ์ฐพ๊ธฐ๊ฐ ์ด๋ ค์์ง๋ค.
์ด์ ๋ํ ํด๊ฒฐ์ฑ ์ผ๋ก ์ฒซ ๋ฒ์งธ๋ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋์ ํํ ์ฌ์ฉํ๋ ๋ช ๋ช ๋ฐฉ์๋ค์ ์ด์ฉํ๋ ๊ฒ์ด๋ค.
- from, of, valueOf, instance ํน์ getInstance, create ํน์ newInstance, getType, newType, type
๋ ๋ฒ์งธ ๋ฐฉ์์ ์๋์ฒ๋ผ ๋ฌธ์ํ๋ฅผ ํ๋ ๊ฒ์ด๋ค.
/**
* ์ด ํด๋์ค์ ์ธ์คํด์ค๋ #getInstance()๋ฅผ ํตํด ์ฌ์ฉํ๋ค.
* @see #getInstance()
*/
public class Settings{
private static final Settings SETTINGS = new Settings();
private Settings(){}
public static Settings getInstance(){
return SETTINGS;
}
}
์ด์์ผ๋ก public ์์ฑ์ ๋์ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ์์ ์์๋ณด์๋ค.
ํด๋น ๊ธ์ ๋ฐฑ๊ธฐ์ ๋์ '์ดํํฐ๋ธ ์๋ฐ ์๋ฒฝ ๊ณต๋ต'์ ์๊ฐํ๊ณ ์์ฑํ ๊ฒ์ ๋๋ค.