์์ฑ ํจํด
์ธ์คํด์ค๋ฅผ ๋ง๋๋ ์ ์ฐจ๋ฅผ ์ถ์ํํ๋ ํจํด์ด๋ค.
- ์์คํ ์ด ์ด๋ค ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์ฌ์ฉํ๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ์บก์ํํ๋ค.
- ๊ฐ์ฒด์ ์์ฑ/์กฐํฉ์ ์บก์ํํ์ฌ ํน์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๊ฑฐ๋ ๋ณ๊ฒฝ๋์ด๋ ํ๋ก๊ทธ๋จ ๊ตฌ์กฐ์ ์ํฅ์ ๋ฐ์ง ์๋๋ก ์ ์ฐ์ฑ์ ์ ๊ณตํ๋ค.
๋น๋ (Builder)
- ๋ณต์กํ ๊ฐ์ฒด์ ์์ฑ๊ณผ์ ๊ณผ ํํ๋ฐฉ๋ฒ์ ๋ถ๋ฆฌํ์ฌ ๊ฐ์ฒด๋ฅผ ๋จ๊ณ๋ณ๋ก ์์ฑํ ์ ์๋๋ก ํ๋ ํจํด์ด๋ค.
- ๋ง์ Optional ํ ๋ฉค๋ฒ ๋ณ์๋ ์ง์์ฑ ์๋ ์ํ ๊ฐ๋ค์ ๋ํด ์ฒ๋ฆฌํด์ผ ํ๋ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๋ค.
- ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ์ต์ํํ์ฌ ๊ฐ์ ํ ๋นํ๋ ์์ ์ถ์ ์ด ์ฝ๋ค.
๐ก ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ ์ต์ํ
์์ ์ ํจํด์ ๋ถํ์ํ๊ฒ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ์ด์ด๋์ด ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ์์ ์ ํ์ ํ๊ธฐ ํ๋ ๋ฐ๋ฉด, ๋น๋ ํจํด์ ๊ฐ์ ํ ๋นํ๋ ์์ ์ด ๊ฐ์ฒด์ ์์ฑ ์์ ๋ฟ์ด๋ผ ์ถ์ ์ด ์ฝ๊ณ ์ ์ง๋ณด์์ฑ์ด ๋๋ค.
public class User {
private final String name;
private final int age;
public static class Builder {
// Required parameters
private final String name;
// Optional parameters
private int age = 0; // ์ ํ์ ์ธ์๋ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ธฐํ
public Builder(String name) {
this.name = name;
}
public Builder age(int val) {
age = val;
return this; // . ์ผ๋ก ์ฒด์ธ์ ์ด์ด๋๊ฐ๊ธฐ ์ํ ๋ฐํ
}
public User build() {
return new User(this);
}
}
private User(Builder builder) {
name = builder.name;
age = builder.age;
}
}
<<Main Class>>
User user = new User
.Builder("Anna") // ํ์ ๊ฐ
.age(15) // ์ ํ ๊ฐ
.build(); // build() ๊ฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋ฐํ
๐ก ๋น๋ ํจํด ๊ตฌํ ๋ฐฉ๋ฒ
- ๋น๋ ํด๋์ค๋ฅผ Static Nested Class๋ก ์์ฑํ๋ค.(๊ด๋ก: ํด๋์ค์ด๋ฆ + Builder)
- ๋น๋ ํด๋์ค์ ์์ฑ์๋ public ์ ๊ทผ ์ง์ ์๋ฅผ ๊ฐ์ง๊ณ ํ์ ๊ฐ๋ค์ ์์ฑ์๋ก ์ ๊ณตํ๋ค.
- ์ ํ ๊ฐ๋ค์ ๊ฐ๊ฐ์ ์์ฑ๋ง๋ค ๋ฉ์๋๋ก ์ ๊ณตํ๋ ๋ฉ์๋์ ๋ฆฌํด ๊ฐ์ ๋น๋ ๊ฐ์ฒด ์์ ์ด์ด์ผ ์ฒด์ธ์ผ๋ก ์ฐ๊ฒฐํ ์ ์๋ค.
- ๋น๋ ํด๋์ค ๋ด์ build() ๋ฉ์๋๋ฅผ ์ ์ํ์ฌ ์ต์ข ์ ์ผ๋ก ์์ฑ๋ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค.
- ๋กฌ๋ณต์ @Builder ์ด๋ ธํ ์ด์ ์ด ์์ ๋์ผํ ์ญํ ์ ํ๋ค.
์ถ์ํฉํ ๋ฆฌ(Abstract Factory)
- ๊ตฌ์ฒด์ ์ธ ํด๋์ค์ ์์กดํ์ง ์๊ณ ์๋ก ์ฐ๊ด๋๊ฑฐ๋ ์์กด์ ์ธ ๊ฐ์ฒด๋ค์ ์กฐํฉ์ ๋ง๋๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ํจํด์ด๋ค.
- ๊ด๋ จ์ฑ ์๋ ์ฌ๋ฌ ์ข ๋ฅ์ ๊ฐ์ฒด๋ฅผ ์ผ๊ด์ฑ ์๋ ๋ฐฉ์์ผ๋ก ์์ฑํ๊ณ ์์ฑ๋ ๊ฐ์ฒด๋ผ๋ฆฌ ์ฝ๊ฒ ๊ต์ฒด๋ ์ ์๋๋ก ๊ณ ์๋์๋ค.
public interface ComputerFactsFactory {
Monitor createMonitor();
}
public class WhiteComputerFactsFactory implements ComputerFactsFactory {
@Override
public Monitor createMonitor() {
return new WhiteMonitor();
}
}
<<MainClass>>
private final ComputerFactsFactory computerFactory;
// ์ถ์ํ ๋์ด์๊ณ ๊ตฌ์ฒด์ ์ธ ํด๋์ค๊ฐ ์๋ ์ธํฐํ์ด์ค์ ์์กดํ์ฌ ๊ฒฐํฉ๋ ฅ์ด ์ฝํจ
computerFactory.crateMonitor();
ํ๋กํ ํ์ (Prototype)
- ์ํ์ด ๋๋ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํด ์๋กญ๊ฒ ์์ฑํ ๊ฐ์ฒด์ ์ข ๋ฅ๋ฅผ ๋ช ์ํ์ฌ ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋ ์์ ์ ์ธ์คํด์ค ํ์ ์ด ๊ฒฐ์ ๋๋ ํจํด์ด๋ค.
- ์ธ์คํด์ค๋ ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์์ ์ ๋ณต์ ํ๊ณ ์๋ณธ ๊ฐ์ฒด๋ฅผ ์๋ก์ด ๊ฐ์ฒด์ ๋ณต์ฌํ์ฌ ํ์์ ๋ฐ๋ผ ์์ ํ๋ ๋งค์ปค๋์ฆ์ ์ ๊ณตํ๋ค.
- ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ฐ ๋น์ฉ์ด ๋ค๊ณ ์ด๋ฏธ ์ ์ฌํ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
ํฉํ ๋ฆฌ๋ฉ์๋(Factory Method)
- ๊ฐ์ฒด ์์ฑ์ ์ญํ ์ ํ๋ ํด๋์ค ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ํจํด์ด๋ค.
- ์์ฑ์์ ๋ณ๋๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฉ์๋๋ฅผ ์ ์ ์ผ๋ก ๋ง๋ค์ด์ ๊ฐ์ฒด ์์ฑ์ ์บก์ํํ์ฌ ์ ๊ณตํ๋ค.
- ๊ฐ์ฒด ์์ฑ์ ์๋ธ ํด๋์ค์๊ฒ ์์ํ๊ณ ํด๋์ค ์์ฑ๊ณผ ๋น์ง๋์ค ์ฒ๋ฆฌ ๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ค.
- ๊ฐ์ ์์ฑ์ ํจํด์ด๋ผ๊ณ ๋ ํ๋ค.
๐ก ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋ ๋ค์ด๋ฐ ์ปจ๋ฒค์
- from: ํ๋์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์์ ๊ฐ์ฒด ์์ฑ
- of: ์ฌ๋ฌ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์์ ๊ฐ์ฒด ์์ฑ
- getInstance | instance: ์ธ์คํด์ค ์์ฑ(์ด์ ๊ณผ ๊ฐ์ ์ ์์)
- newInstance | create: ์๋ก์ด ์ธ์คํด์ค ์์ฑ
- get[OrderType]: ๋ค๋ฅธ ํ์ ์ ์ธ์คํด์ค ์์ฑ(์ด์ ๊ณผ ๊ฐ์ ์ ์์)
- new[OrderType]: ๋ค๋ฅธ ํ์ ์ ์๋ก์ด ์ธ์คํด์ค ์์ฑ
์ฑ๊ธํค(Singleton)
- ํ๋ก๊ทธ๋จ ๋ด์์ ์ค์ง ํ๋์ ์ธ์คํด์ค๋ง ์์ฑ๋จ์ ๋ณด์ฅํ๋ ํจํด์ด๋ค.
- ํ๋ก๊ทธ๋จ ์ด๋์๋ ์ธ์คํด์ค์ ์ ๊ทผํ ์ ์๋ค.
- ์ปค๋ฅ์ ํ, ์ค๋ ๋ ํ, ๋๋ฐ์ด์ค ์ค์ ๊ฐ์ฒด ๋ฑ์ ์ธ์คํด์ค๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ง๋ค๋ฉด ์์์ด ๋ญ๋น๋๊ธฐ ๋๋ฌธ์ ํด๋น ํจํด์ ํ์ฉํ๋ค.
public class Singleton {
// ๋จ์ผ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ฐธ์กฐ๋ณ์๊ฐ ํ์ํ๋ค.
private static Singleton singleton = null;
// new ๋ฅผ ์คํํ ์ ์๋๋ก ์์ฑ์์ private ์ ๊ทผ ์ ์ด์๋ฅผ ์ง์ ํ๋ค.
private Singleton() {
}
// ์ ์ผํ ๋จ์ผ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋๋ก ์ ์ ๋ฉ์๋๋ฅผ ์ง์ํด์ผ ํ๋ค.
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
์ถ์ฒ
https://velog.io/@ha0kim/Design-Pattern-%EC%83%9D%EC%84%B1-%ED%8C%A8%ED%84%B4Creational-Patterns
https://it-techtree.tistory.com/m/entry/design-pattern-creation-pattern
'๊ฐ๋ฐ ํ > ์๋น์ค & ์ํคํ ์ฒ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
GoF ๋์์ธ ํจํด (0) | 2022.09.16 |
---|---|
ํด๋ผ์ฐ๋ ์ปดํจํ ๊ณผ IaaS/PaaS/SaaS (0) | 2022.05.01 |
DevOps (0) | 2022.03.23 |
ํ๋์จ์ด ๊ฐ์ํ ์ข ๋ฅ (0) | 2022.03.22 |
docker (0) | 2022.03.11 |
๋๊ธ