[μλ° λ§μ€ν°λΆ] 12μ₯ λμμΈν¨ν΄ μ¦κΈ°κΈ° - μμ±
12.1 λμμΈ ν¨ν΄μ κΈ°λ³Έ
12.1.1 λμμΈ ν¨ν΄μ΄λ?
μ°λ¦¬κ° νλ‘κ·Έλ¨μ μμ±ν λ μμ±λλ κ²μ 'λͺ©μ 'κ³Ό 'κ°λ°μ'μ λ°λΌ μ²μ°¨λ§λ³μ΄λ€. κ·Έλ¬λ μ΄λ₯Ό κ°κ°μ λΆνλ¨μλ‘ μ΄ν΄λ³΄λ©΄ νλ‘κ·Έλ¨λ§λ€ λΉμ·ν λΆλΆμ΄ μ‘΄μ¬νλ€.
μλ₯Ό λ€μ΄, 'μ΄λ€ μνκ° λ°λμμ λ λ°μνλ ν΄λμ€κ΅° λ§λ€κΈ°'
'λ€λ₯Έ νμ΄ λ§λ λΆνκ³Όμ μ€κ°λ₯Ό νλ ν΄λμ€ λ§λ€κΈ°',
'μ¬κ·μ μΈ κ΅¬μ‘°λ₯Ό ν΄λμ€λ‘ νννκΈ°'μ κ°μ κ²λ€μ΄ μλ€.
μ΄λ° λΉμ·ν λͺ©μ μ λν΄ ν΄λμ€ κ΅¬μ‘°μ λͺ¨λ²μ¬λ‘λ₯Ό ν¨ν΄μΌλ‘ μ 리ν κ²μ΄ λμμΈ ν¨ν΄μ΄λ€.
μ΄ μ€ κ°μ₯ μ λͺ ν κ²μ΄ 'GoF λμμΈ ν¨ν΄'μ΄λ©° κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°μ λμμ΄λλ λμμΈ ν¨ν΄ 23κ°μ§λ₯Ό μκ°νλ€.
23μ’ λ₯μ ν¨ν΄μ ν¬κ² 3κ°μ§λ‘ λΆλ₯λμ΄ μλ€.
- κ°μ²΄μ 'μμ±'μ κ΄ν ν¨ν΄
- νλ‘κ·Έλ¨μ 'ꡬ쑰'μ κ΄ν ν¨ν΄
- κ°μ²΄μ 'νλ'μ κ΄ν ν¨ν΄
λμμΈ ν¨ν΄μ μ¬μ©νλ©΄ μ’μμ
1. μ¬μ¬μ©μ±μ΄ λκ³ μ μ°μ± μλ μ€κ³κ° κ°λ₯νλ€.
κ³ μλ€μ΄ μ μ€κ³ν΄λ ν¨ν΄μ μ¬μ©νκΈ° λλ¬Έμ λ§€μ° μ μ©νλ€.
2. μμ¬ μν΅μ΄ μ¬μμ§λ€.
μμ£Ό μ¬μ©νλ νΉμ μ€κ³λ₯Ό μ€λͺ ν λ λ€λ₯Έ κΈ°μ μμκ² μ΄λ₯Ό μ€λͺ νκΈ° μν΄ λ§μ λΆκ°μ€λͺ μ ν΄μΌνμ§λ§ 'ν¨ν΄'μ μκ³ μλ€λ©΄ μ΄λ₯Ό ν΅ν΄ μν΅μ΄ κ°λ₯νλ€.
12.2 μμ±μ κ΄ν ν¨ν΄
- μμ±μ κ΄ν λμμΈ ν¨ν΄
AbstractFactory - κ΄λ ¨λ μΌλ ¨μ μΈμ€ν΄μ€λ₯Ό μν©μ λ°λΌ μ μ νκ² μμ±νλ λ°©λ² μ 곡.
Builder - 볡ν©νλ μΈμ€ν΄μ€ μμ± κ³Όμ μ μννλ€.
Singleton - νΉμ ν΄λμ€μ λν΄ μΈμ€ν΄μ€κ° νλμμ 보μ₯.
12.2.1 AbstractFactory ν¨ν΄ - μΌλ ¨μ μΈμ€ν΄μ€κ΅° λͺ¨μμ μμ±νκΈ°
μ€μ νμΌμ κΈ°μ¬λ μ 보μ λ°λΌ DBMSλ₯Ό μμλ‘ λ°κΏμ μ¬μ©ν μ μλ νλ‘κ·Έλ¨μ μκ°ν΄λ³΄μ. DBMSμ μ κ·ΌνκΈ° μν΄μλ νλ‘κ·Έλ¨μμ 컀λ₯μ κ°μ²΄λ₯Ό μμ±νμ¬ λ°μ΄ν°μ μ‘μΈμ€νκ² λλ€. μ΄ κ³Όμ μ DBMS λ§λ€ λ€λ₯΄κΈ° λλ¬Έμ DBMSλ§λ€ μ°κ΄λ μΈμ€ν΄μ€λ₯Ό νκΊΌλ²μ μμ±νλ λ°©λ²μ΄ μλ€λ©΄ λ§€μ° νΈν κ²μ΄λ€.
AbstractFactory ν¨ν΄μ μΈμ€ν΄μ€μ μμ±μ μ λ¬ΈμΌλ‘ μ€μνλ ν΄λμ€(Factory)λ₯Ό μ€λΉνμ¬ μΌκ΄μ±μ μ μ§ν΄μΌνλ μΈμ€ν΄μ€λ€μ μμ±νκΈ° μν ν¨ν΄μ΄λ€.
- Factory.java
public interface Factory {
Connection getConnection();
Configuration getConfiguration();
}
DBMSκ° μμ±ν΄μΌνλ ν΄λμ€λ₯Ό λ©μλλ‘ μ μν΄λμλ€.
- createProduct() μ λν μ μ (컀λ₯μ , μ€μ λ±)
public abstract class Configuration {
// μμμ μ²λ¦¬
}
public abstract class Connection {
// μμμ μ²λ¦¬
}
- ConcreteFactory (ꡬ체μ μΈ ν©ν 리μ λν ꡬν)
// PostgreSQLμ μμ±νλ ν΄λμ€
public class PostgreSQLFactory implements Factory{
@Override
public Connection getConnection() {
return new PostgreSQLConnection();
}
@Override
public Configuration getConfiguration() {
return new POstgreSQLConfiguration();
}
}
// MySQLμ μμ±νλ ν΄λμ€
public class MySQLFactory implements Factory {
@Override
public Connection getConnection() {
return new MySQLConnection();
}
@Override
public Configuration getConfiguration() {
return new MySQLConfiguration();
}
}
- μμ±ν΄μΌνλ κ°μ²΄λ₯Ό ꡬνν ꡬν체λ€
public class MySQLConfiguration extends Configuration {
//MySQL μ€μ μ 보μ λ‘λ© μ²λ¦¬
}
public class MySQLConnection extends Connection {
// MySQLμ 컀λ₯μ
μ²λ¦¬
}
public class POstgreSQLConfiguration extends Configuration {
// PostgreSQLμ μ€μ μ 보μ λ‘λ© μ²λ¦¬
}
public class PostgreSQLConnection extends Connection {
// PostgreSQL 컀λ₯μ
μ²λ¦¬
}
- SampleMain.java
public class SampleMain {
public static void main(String[] args) {
String env = "PostgreSQL";
Factory factory = createFactory(env);
Connection connection = factory.getConnection();
Configuration configuration = factory.getConfiguration();
}
private static Factory createFactory(String env) {
switch (env) {
case "PostgreSQL":
return new PostgreSQLFactory();
case "MySQL":
return new MySQLFactory();
default:
throw new IllegalArgumentException();
}
}
}
λ©μΈ λ©μλμμλ "μ€μ κ°"μ λ°λΌ κ°κ°μ DBMSμ λμλλ κ°μ²΄λ₯Ό μμ±νλ€. λ°νκ°μ 곡ν΅μ μΆμμ μΈ ν΄λμ€λ‘ ꡬννκΈ° λλ¬Έμ ꡬν λ΄μ©μ μ κ²½μ°μ§ μκ³ μ»€λ₯μ μ 보μ μ€μ μ 보λ₯Ό μ·¨λν μ μλ€.
AbstractFactory ν¨ν΄μ κ΄λ ¨λ μΌλ ¨μ μΈμ€ν΄μ€λ€μ λͺ¨μμ μμ±νλ κ²½μ°μ μλ ₯μ λ°ννλ€. νκ²½μ΄λ 쑰건μ λ°λΌ μ²λ¦¬ ν¨ν΄μ μ ννμ¬ μ€ννλ ꡬ쑰λ₯Ό μ€νν λ νλ μμν¬μ μ΄μ©μκ° κ΅¬μ²΄μ μΈ μ²λ¦¬ λ΄μ©μ μμνμ§ μκ³ νΈμΆν μ μλ μ μ΄ μ₯μ μ΄λ€.
12.2.2 Builder ν¨ν΄ - 볡ν©νλ μΈμ€ν΄μ€ μμ± κ³Όμ μ μννλ€.
μμ±μ νλ¦μ 곡ν΅ννκΈ° μν μλ¨μ΄ 'Builder ν¨ν΄'μ΄λ€. 볡μ‘ν μμ° κ³Όμ μ΄ νμν μΈμ€ν΄μ€μ λν΄ κ·Έ μμ±κ³Όμ μ μνν¨μΌλ‘μ¨ λμΌκ³Όμ μΌλ‘ μλ‘ λ€λ₯Έ λ΄λΆ νμμ μΈμ€ν΄μ€λ₯Ό μ»κΈ° μν ν¨ν΄μ΄λ€.
- Builder μΈν°νμ΄μ€
public interface Builder {
void createHeader();
void createContents();
void createFooter();
Page getResult();
}
- Builder μΈν°νμ΄μ€λ₯Ό κ°μ§κ³ μλ Director ν΄λμ€ - μ²λ¦¬μ κ³Όμ μ ꡬνν΄λ .
public class Director {
private Builder builder;
public Director(Builder builder) {
this.builder = builder;
}
public Page construct() {
builder.createHeader();
builder.createContents();
builder.createFooter();
return builder.getResult();
}
}
- Page
public class TopPage extends Page{
// 맨 μ νμ΄μ§
}
public class Page {
private String header;
private String contents;
private String footer;
// getter, setter μλ΅.
}
- λΉλλ₯Ό μ΄λ»κ² ꡬνν μ§μ λν μ€μ μ²λ¦¬ -> TopPageBuilder
public class TopPageBuilder implements Builder{
private TopPage page;
public TopPageBuilder() {
this.page = new TopPage();
}
@Override
public void createHeader() {
this.page.setHeader("TOP Header");
}
@Override
public void createContents() {
this.page.setContents("TOP Contents");
}
@Override
public void createFooter() {
this.page.setFooter("TOP Footer");
}
@Override
public Page getResult() {
return this.page;
}
}
- SampleMain.java
public class SampleMain {
public static void main(String[] args) {
Builder builder = new TopPageBuilder();
Director director = new Director(builder);
Page page = director.construct();
}
}
λλ ν°μ ꡬ체μ μΌλ‘ ꡬνλμ΄μ§ λΉλμ μΈν°νμ΄μ€ μ°Έμ‘°λ₯Ό μΈμλ‘ λ겨μ€λ€. λλ ν°λ μ΄λ₯Ό ν΅ν΄ λ¬Έμλ₯Ό μμ±νλ κ³Όμ μ μ²λ¦¬ν μ μλ€.
μ΄λ»κ² ꡬνλ Builderλ₯Ό λ겨주λλμ λ°λΌ Pageμ λ΄μ©μ΄ λ¬λΌμ§ μ μλ€.
λΉλ ν¨ν΄μ μ΄μ©νλ©΄ μ΄μ©μκ° μμ± μ²λ¦¬μ νλ¦μ μμνμ§ μκ³ (Directorμ²λ¦¬) κ°λ³ μ²λ¦¬(Builder ꡬν)μλ§ μ£Όλͺ©νμ¬ κ΅¬νν μ μλ κ²μ΄ μ₯μ μ΄λ€.
12.2.3 Singleton ν¨ν΄ - νΉμ ν΄λμ€μ λν΄ μΈμ€ν΄μ€κ° νλμμ 보μ₯νλ€.
μμ€ν μ 체μ 곡ν΅μ μΌλ‘ μ¬μ©λλ μ€μ μ 보λ₯Ό λͺ¨μμ 보κ΄νλ ν΄λμ€κ° μλ€κ³ νμ. μμ€ν μμ λ³κ²½λ μ€μ λ΄μ©λ 보쑴ν νμκ° μλ κ²½μ° μ€μ μ 보λ₯Ό 보κ΄ν ν΄λμ€κ° μ¬λΏμ΄ μκ² λλ€λ©΄ 'μΌκ΄μ±μ΄ μκ² λλ€.' κ·Έλ¬λ©΄ μ°λ¦¬λ μμ€ν μ΄ νμ λμΌν νλμ μΈμ€ν΄μ€λ₯Ό μ°Έμ‘°νλλ‘ νλ€λ©΄ μ°λ¦¬μ λͺ©μ μ λ¬μ±ν μ μλ€.
μ΄λ₯Ό μ€ννκΈ° μν μλ¨μ΄ λ°λ‘ Singletonν¨ν΄μ΄λ€. (νΉμ ν΄λμ€μ μΈμ€ν΄μ€κ° μ μΌν μ‘΄μ¬μμ 보μ₯νλ κ²)
public class Configure {
private static Configure instance = new Configure();
private Configure() {
// μ€μ μ 보λ₯Ό μ½μ΄λ€μ΄λ μ²λ¦¬
}
public static Configure getInstance() {
return instance;
}
}
public class SampleMain {
public static void main(String[] args) {
Configure configure = Configure.getInstance();
}
}
getInstnace() μ€νν± λ©μλλ₯Ό ν΅ν΄ Configureκ°μ²΄λ₯Ό κ°μ Έμ¬ μ μλ€. μ΄ κ°μ²΄λ μμ€ν μμ μ¬μ©νλ μ μΌν Configure κ°μ²΄μ΄λ€.
λ¨, Singleton ν¨ν΄μ μ΄μ©νλ©΄ μ¬λ¬ μμ μ΄ λμμ μΈμ€ν΄μ€λ₯Ό μ‘°μν΄λ 무결μ±μ μμνμ§ μλλ‘ μΈμ€ν΄μ€μ λ€μ€ μ μμ μμν λ°°νμ μΈ μ²λ¦¬λ₯Ό μ€μν΄μΌ νλ€λ μ μ κΈ°μ΅ν΄λμ.