๋ชฉ์ฐจ
์ด๋ค ์ํฉ์์ ์ฐ์ผ๊น?
ํ์๋ฐฐ๋ ํ์์๊น์, ํ์๋งํฌ์, whiteship์ด๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์๋ค.
๊ฒ์ ๋ฐฐ๋ ๊ฒ์ ์๊น์, ๊ฒ์ ๋งํฌ์, blackship์ด๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์๋ค.
๋ ธ๋๋ฐฐ๋ ํ์๋ฐฐ, ๊ฒ์ ๋ฐฐ์ ๋์ผํ ์์ ์ ๋ด์ฉ๋ฌผ๋ง ๋ฐ๊พธ์ด ๋ง๋ค ์ ์๋ค.
๋ฐฐ๋ฅผ ๋ง๋๋ ์ฝ๋๊ฐ if๋ฌธ์ผ๋ก ๋ถ๊ธฐ์ฒ๋ฆฌ ๋์ด์์ผ๋ฉด
์ด๋ก๋ฐฐ๋ฅผ ๋ง๋ค์ด์ผํ ๊ฒฝ์ฐ ๋ถ๊ธฐ์ฒ๋ฆฌ๊ฐ 4๊ฐ๋ ์ด๋ฃจ์ด์ง๊ฒ๋์ด ๊น๋ํ ์ฝ๋๊ฐ ์๋๊ฒ์ด๊ณ ,
๊ณ์ ์ฝ๋๋ฅผ ์์ ํด์ผํ๋ ํ์ฅ์ ์ ์ฐํ์ง๋ ์๊ฒ๋๋ค.
๋ฐฐ์ ๊ณตํต์ ์ธ color, mark, name์ ์ง์ ํ ์ ์๋๋ก ํฉํ ๋ฆฌ๋ฅผ ์ง์ ํ๊ณ ,
ํฉํ ๋ฆฌ๋ก๋ถํฐ ํ์๋ฐฐ, ๊ฒ์ ๋ฐฐ, ๋ ธ๋๋ฐฐ๋ฅผ ๋ง๋ค ์ ์๋๋ก ํ๋ฉด ์ด๋จ๊น??
ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ด๋?
๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ง๋ ์๋ธ ํด๋์ค๊ฐ ์ ํ๊ฒํ๋ ํจํด์ด๋ค
์ฅ์
- ํ์ฅ์ ์ด๋ ค์๊ณ ๋ณ๊ฒฝ์ ๋ซํ์๋ ๊ฐ์ฒด์งํฅ์์น OCP๋ฅผ ์งํฌ ์ ์๋ค
- ๊ธฐ์กด์ ์ฝ๋, ํนํ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ์ฝ๋๋ฅผ ๊ฑด๋ค์ด์ง ์๊ณ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์๋ค
๋จ์
- ์ธ์คํด์ค๊ฐ ์ถ๊ฐ๋ ๋๋ง๋ค ํด๋์ค ํ์ผ์ด ๊ณ์ ์์ฑ๋๋ค
๊ตฌํ๋ฐฉ๋ฒ
๊ธฐ์กด์ฝ๋
public class ShipFactory {
public static Ship orderShip(String name, String email) {
//validate
if (name == null || name.isBlank()) {
throw new IllegalArgumentException("๋ฐฐ ์ด๋ฆ์ ์ง์ด์ฃผ์ธ์.");
}
if (email == null || email.isBlank()) {
throw new IllegalArgumentException("์ฐ๋ฝ์ฒ๋ฅผ ๋จ๊ฒจ์ฃผ์ธ์.");
}
Ship ship = new Ship();
ship.setName(name);
// Customizing for specific name
if (name.equalsIgnoreCase("whiteship")) {
ship.setLogo("\uD83D\uDEE5๏ธ");
} else if (name.equalsIgnoreCase("blackship")) {
ship.setLogo("โ");
}
// coloring
if (name.equalsIgnoreCase("whiteship")) {
ship.setColor("white");
} else if (name.equalsIgnoreCase("blackship")) {
ship.setColor("black");
}
return ship;
}
}
๋ณ๊ฒฝ์ฝ๋
ShipFactory ํด๋์ค๋ฅผ ์ธํฐํ์ด์ค๋ก ๋ณ๊ฒฝํ๊ณ
์ด๋ฆ, ๋ก๊ณ , ์๊น์ ์ง์ ํ๋ ๊ฒ์ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ํด๋์ค๋ก ๋ณ๊ฒฝํ๋ค
public interface ShipFactory {
default Ship orderShip(String name, String email) {
validate(name, email);
Ship ship = createShip();
return ship;
}
//๊ตฌํ ํด๋์ค์์ ๊ตฌํํ ๋ฉ์๋
Ship createShip();
//๊ณตํต์ ์ผ๋ก ์ฐ์ด๋ ์ ํจ์ฑ๊ฒ์ฌ ๋ฉ์๋
private void validate(String name, String email) {
if (name == null || name.isBlank()) {
throw new IllegalArgumentException("๋ฐฐ ์ด๋ฆ์ ์ง์ด์ฃผ์ธ์.");
}
if (email == null || email.isBlank()) {
throw new IllegalArgumentException("์ฐ๋ฝ์ฒ๋ฅผ ๋จ๊ฒจ์ฃผ์ธ์.");
}
}
}
public class WhiteshipFactory implement ShipFactory {
@Override
public Ship createShip() {
return new Whiteship();
//ํด๋น ์์ ์ฝ๋์์๋ new Whiteship()์ ๋ง๋ค์ด์ ๋ฐํํด์ฃผ๊ธฐ๋ง ํ๋ฉด๋์ง๋ง
//๋ง์ฝ ๋์ค์ ํ์์ ๋ฐฐ๋ 100kg๊น์ง ์ ์ฌํด์ผํ๊ณ , ๊ฒ์ ์ ๋ฐฐ๋ 150kg๊น์ง ์ ์ฌํด์ผํ๋ค๋ ์กฐ๊ฑด์ด ์ถ๊ฐ๋๋ฉด
//WhiteshipFactoryํด๋์ค์์ validation์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผํ๋ค!
}
}
public class Whiteship extends Ship {
public Whiteship() {
setName("whiteship");
setLogo("\uD83D\uDEE5๏ธ");
setColor("white");
}
}
public class Client {
public static void main(String[] args) {
Client client = new Client();
client.print(new WhiteshipFactory(), "whiteship", "keesun@mail.com");
client.print(new BlackshipFactory(), "blackship", "keesun@mail.com");
}
//ShipFactory๋ฅผ ๋ฐ๊ธฐ๋๋ฌธ์ YellowshipFactory๊ฐ ์๊ธด๋คํด๋ print๋ฉ์๋๋ ๋ณํจ์ด ์๋ค
private void print(ShipFactory shipFactory, String name, String email) {
System.out.println(shipFactory.orderShip(name, email));
}
}
์ฌ๊ธฐ์ Blackship์ ๋ง๋ค๋, Whiteship์ ์ฝ๋๋ฅผ ์์ ํ ์ด์ ๊ฐ ์์๊น??? ์๋ค!
Whiteship๊ณผ ๋์ผํ๊ฒ BlackshipFactory, Blackship์ ์์ฑํด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค!
๋ณ๊ฒฝ์๋ ๋ซํ์๊ณ ํ์ฅ์๋ ์ด๋ ค์๋ ์ฝ๋๊ฐ ์์ฑ๋์๋ค~!
'๐ฐ Design Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Adapter Pattern | ์ด๋ํฐํจํด (0) | 2022.08.14 |
---|---|
Prototype Pattern | ํ๋กํ ํ์ ํจํด (0) | 2022.08.14 |
Abstract Factory | ์ถ์ ํฉํ ๋ฆฌ ํจํด (0) | 2022.08.14 |
Singleton pattern | ์ฑ๊ธํคํจํด (3) | 2022.07.29 |
[๊ฐ์ฒด ์์ฑ ํจํด] ์ ์ธต์ ์์ฑ์ ํจํด โ ์๋ฐ๋น ํจํด โ Builder ํจํด, lombok @Builder ์ฌ์ฉ๋ฐฉ๋ฒ ๋ฐ ์ฃผ์์ (0) | 2022.01.29 |