ํด๋น ๊ธ์ Gang of Four์ ๋์์ธ ํจํด ์ด๋ผ๋ ์ฑ ์ ์ฝ๊ณ ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌ ๋ฐ ํ๊ณ ํ๋ ๊ธ ์ ๋๋ค. ์์ธํ ์ฌํญ์ YES 24 GoF์ ๋์์ธ ํจํด ์์ ํ์ธํด์ฃผ์ธ์.
GoF ์ ๋์์ธ ํจํด - ์ฌ์ฌ์ฉ์ฑ์ ์ง๋ ๊ฐ์ฒด์งํฅ ์ํํธ์จ์ด์ ํต์ฌ ์์
- ํ๋กํ ๋ฏธ๋์ด
- ์ง์์ด: ์๋ฆญ ๊ฐ๋ง, ์กด ๋ธ๋ฆฌ์ฌ์ด๋์ค, ๋ฆฌ์ฒ๋ ํฌ๋ฆ, ๋ํ ์กด์จ
- ์ฎ๊ธด์ด: ๊น์ ์
- ๋ค์ ๊ธ์ ํจ๊ป ์ฝ์ผ๋ฉด ์ข์ต๋๋ค.
ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด, Factory Method Pattern
๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ์ง๋ง, ์ด๋ค ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ง์ ๋ํ ๊ฒฐ์ ์ ์๋ธ ํด๋์ค๊ฐ ๋ด๋ฆฌ๋๋ก ํฉ๋๋ค.
- Factory Method ๋ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก Virtual Constructor ๋ผ๊ณ ๋ ํ๋ค.
๋๊ธฐ
์ฌ์ฉ์์๊ฒ ๋ค์ํ ์ข ๋ฅ์ ๋ฌธ์๋ฅผ ํํํ ์ ์๋ ์์ฉ ํ๋ก๊ทธ๋จ ํ๋ ์์ํฌ๊ฐ ์๋ค๊ณ ํ์ ๋, ์ฒ์์๋ PdfDocument ๋ง ์กด์ฌํด ๋ชจ๋ ์ฝ๋๊ฐ PDFDocument ์ ์์กด์ ์ด๊ฒ ๊ฐ๋ฐ๋์๋ค๊ณ ํ์.
ํ์ง๋ง ์๊ฐ์ด ์ง๋๊ณ ExcelDocument ์ HwpDocument ๊ฐ ํ์ํ๋ค๋ ์๊ตฌ์ฌํญ์ด ๋ฐ์ํ๋ฉด ๊ธฐ์กด์ Document ๋ฅผ ์์ฑํ๊ธฐ ์ํด ๊ตฌ์ฑ๋ ์ฝ๋๋ฅผ ๋ค๋ฐฉ๋ฉด์ผ๋ก ์์ ํด์ผ ํ๋ค.
์ฆ, ํ์ฌ์ ์ฝ๋๋ PdfDocument ์ ์์กด์ ์ด๊ฒ ๋์๋ค.
์ด๋ฌํ ์ํฉ์ด ๋ฐ์ํ๊ฒ ๋ ์ด์ ๋ ์์ฑ์ ์ฑ ์์ ๋ถ๋ฆฌํ์ง ์์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ค.
์ด ๋ ์์ฑ์ ์ฑ ์๋ง์ ๊ฐ๋๋ก ํ๋ Factory ํด๋์ค๋ฅผ ์ด์ฉํ ์ ์๊ณ ์ด๋ฅผ ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
ํจํด์ ๋ํด
Factory Method ํจํด์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ Client ์์ new ๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ Factory ๋ฅผ ํตํด new ์ฐ์ฐ์๋ฅผ ๋์ ํด์ฃผ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ค.
๊ตฌํ
์ฐธ์ฌ ๊ฐ์ฒด
- Creator
RoleFactory
- Product
Role
- ConcreteProduct
AdminRole
MemberRole
Factory Class
public class RoleFactory {
public Role createRole(RoleType type) {
if (RoleType.ADMIN.equals(type)) {
return new AdminRole();
} else if (RoleType.MEMBER.equals(type)) {
return new MemberRole();
}
throw new NullPointerException();
}
}
์ฐ์ Product ๋ฅผ ์์ฑํ๋ Factory ํด๋์ค์ด๋ค.
ํด๋น ํด๋์ค์์๋ Role ์ ์์ฑํ๋ ํ ๊ฐ์ง์ ์ฑ ์๋ง ์กด์ฌํ๋ค
์ด๋ ๊ฒ ๋๋ค๋ฉด ์ด ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ๋ ์ด์ ๋ Product ๊ฐ ์ถ๊ฐ๋ ๋ ๋ผ๋ ํ ๊ฐ์ง ์ด์ ๋ง ์กด์ฌํ๋ค.
ํ์ง๋ง ๋ณ๊ฒฝ์ด ๋๋ค๋ผ๋๊ฒ ์์ฒด๋ ํ ๋ฒ ์๊ฐํด๋ณผ ์ฌ์ง๊ฐ ์กด์ฌํ๋ค.
์ฆ, SRP ๋ฅผ ๋ง์กฑํ๋ OCP ๋ฅผ ๋ง์กฑํ์ง ์๋ ๊ตฌ์กฐ๊ฐ ๋๋ค.
Product Class
public interface Role {
String describeRole();
}
public class MemberRole implements Role {
private String information = "This is Member Role";
@Override
public String describeRole() {
return information;
}
}
public class AdminRole implements Role {
private String information = "This is Admin Role";
@Override
public String describeRole() {
return information;
}
}
public enum RoleType {
ADMIN, MEMBER
}
์์ ์ฝ๋๋ค์ Factory ์์ ์์ฑํ๊ฒ๋ Product ํด๋์ค์ด๋ค.
ConcreteProduct ๋ ๋ชจ๋ Product ์ธ Role ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋ ํํ๋ก ๊ตฌ์ฑ๋๋ค.
๋ง์ง๋ง์ ์กด์ฌํ๋ RoleType ์ Factory ์์ ์์ฑํ Role ๋ค์ ๊ตฌ๋ถํ ์ ์๋๋ก ๊ตฌ๋ถ์์ ์ญํ ์ ํ ์ ์๋ Enum ์ด๋ค
Client
public class Client {
public static void main(String[] args) {
RoleFactory factory = new RoleFactory();
Role role = factory.createRole(RoleType.ADMIN);
System.out.println(role.describeRole());
}
}
ํด๋ผ์ด์ธํธ ์ฝ๋์์๋ factory ์๊ฒ RoleType ์ ๋๊ธฐ๊ฒ ๋๊ณ RoleType ์ ๋ฐ๋ผ ์ ์ ํ Role ๋ฅผ ๋ฐํ๋ฐ๊ฒ ๋๋ค.
์ฅ์ ๊ณผ ๋จ์
์ฅ์
- ์์ฑ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌํ ์ ์๋ค.
- SRP ๋ฅผ ์ ์งํฌ ์ ์๋ค.
๋จ์
- ๋ง์ Product ์ Subclass ๋ค๋ก ์ธํด์ ๋ณต์กํด์ง ์ ์๋ค.
์ ๋ฆฌ
์ฌ๋ฌ ์ํํธ์จ์ด์์ Factory Method ๋ฅผ ์์์ผ๋ก ์ ์ Abstract Factory ๋ Prototype ์ผ๋ก ๋ฐ์ ํ๊ฒ ๋๋ค.
์ฆ, ๋ ๋ณต์กํ ์์ฑ ํจํด์ ๊ธฐ๋ณธ์ด๋ผ๊ณ ํ ์ ์๋ ํจํด์ด๋ฉฐ ๊ฐ์ฅ ์ดํดํ๊ธฐ ์ฌ์ด ํจํด์ด๋ค.
GoF ์์ ์๊ฐ๋๋ ๋ง์ ๋์์ธ ํจํด๋ค์ด ๋ชจ๋ ์ฌ์ฉ๋๊ณ ์๋๊ฒ ๊ฐ์ง๋ ์๋ค.
์ฌ๋ฌ ํจํด๋ค ์ค์์ ๋ช๋ช ์ ์ฉํ๊ณ ์ธ๋ชจ์๋ ํจํด๋ค๋ง ์ฃผ๋ก ์ฌ์ฉ์ด ๋๋๋ฐ, ์ด Factory Method ์ญ์ ์์ฃผ ์ฌ์ฉ๋๊ณ ์๋ ํจํด์ด๋ผ๋ ์๊ฐ์ด ๋ ๋ค.
๋๊ธ