๐ ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ด๋ ?
- ์๋ฐ ๋์์ธํจํด ์ค ํ๋๋ก ๊ฐ์ฒด์ ์์ฑ์ ๋์ ์ํํด์ฃผ๋ ๊ณต์ฅ์ด๋ผ๊ณ ํ ์ ์๋ค.
- ๊ฐ์ฒด์ ์์ฑ์ ํ์ ํด๋์ค์์ ๋์ ํ๋ค.
- ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ์ง ์๊ณ ๋ฉ์๋๋ฅผ ํตํด์ ๊ฐ์ ์ ์ผ๋ก ์์ฑํ ํ ๋ฐํํ๋ ํ์
ํน์ง)
- Factory ํด๋์ค๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ฒด ์์ฑ
- ํ๋์ ๋ฉ์๋๋ก ์ฌ๋ฌ ๊ฐ์ ์ข ๋ฅ์ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
- abstract, interface์ ํ์ฉํด ๊ฐ์ฒด ์์ฑ์ ์๋ธ ํด๋์ค์ ์์ => ์๋ธ ํด๋์ค๋ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ๊ตฌํํด ๊ฐ์ฒด๋ฅผ ์์ฑ
Product :
- ํฉํ ๋ฆฌ ๋ฉ์๋๊ฐ ์์ฑํ๋ ๊ฐ์ฒด์ ์ธํฐํ์ด์ค ์ ์
ConcreteProduct :
- Product ํด๋์ค์ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ค์ ๋ก ๊ตฌํํ๋ ํด๋์ค
Creator :
- Product ํ์ ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ ์ธํ๋ ํด๋์ค
- ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌํ, ConcreteProduct ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
- Product ๊ฐ์ฒด์ ์์ฑ์ ์ํด ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
ConcreteCreator :
- ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ฌ ConcreteProduct์ ์ธ์คํด์ค๋ฅผ ๋ฐํ
๐ ์์ ( Creator๋ฅผ ์ถ์ ํด๋์ค๋ก ์ ์, ํฉํ ๋ฆฌ ๋ฉ์๋๋ abstract๋ก ์ ์ธ )
1. Product
: ์ผํํ ๋ ๊ฒ์, ๋ด๊ธฐ , ์ฃผ๋ฌธํ๊ธฐ , ํ์ธํ๋ ๊ฒ์ ๊ณตํต๊ณผ์ ์ด๊ธฐ์ ์ธํฐํ์ด์ค์ ์์ฑ
//Shopping.java
public interface Shopping {
public void find(); //๋ฌผ๊ฑด์ ๊ฒ์ํ๋ค
public void cart(); //์นดํธ์ ๋ด๋๋ค.
public void order(); //์นดํธ์ ๋ด์ ๋ฌผ๊ฑด์ ์ฃผ๋ฌธํ๋ค.
public void check(); //์ฃผ๋ฌธ์ด ์ ๋๋ก ๋์๋์ง ํ์ธํ๋ค.
}
2. Creator
: ์์ ํ์๋ค์ ์ผํ๋ชฐ์์ ์ ๋ถ ์ด๋ค์ง๋ค.
//ShoppingMall.java
public abstract class ShoppingMall {
public Shopping shopping(String category) {
Shopping shopping = selectCategory(category); //factory method ์ฌ์ฉ
shopping.find();
shopping.cart();
shopping.order();
shopping.check();
return shopping;
}
//factory method
abstract Shopping selectCategory(String category);
}
3.ConcreteCreator : Timon๊ณผ coupang์ ์ผํ๋ชฐ์ด๊ธฐ์ ShopingMall ํด๋์ค๋ฅผ ์์๋ฐ๋๋ค.
//Timon.java
public class Timon extends ShoppingMall{
@Override
Shopping selectCategory(String category) {
System.out.println("-----------Timon-----------");
if (category.equals("Food")) {
return new TimonFoodCategory();
} else if (category.equals("Health")) {
return new TimonHealthCategory();
}
return null;
}
}
//Koupang.java
public class Koupang extends ShoppingMall{
@Override
Shopping selectCategory(String category) {
System.out.println("-----------Koupang-----------");
if (category.equals("Food")) {
return new KoupangFoodCategory();
} else if (category.equals("Health")) {
return new KoupangHealthCategory();
}
return null;
}
}
4.ConcreateProduct : Shopping ์ธํฐํ์ด์ค์ ์์ฑํด๋์๋ ๊ณผ์ ์ override๋ฅผ ํตํด ๊ตฌ์ฒด์ ์ผ๋ก ์์ฑ
//TimonFoodCategory.java
public class TimonFoodCategory implements Shopping{
@Override
public void find() {
System.out.println("๋ญ๊ฐ์ด์ด ๋ธ๋๋๋ฅผ ๊ฒ์ํฉ๋๋ค.");
}
@Override
public void cart() {
System.out.println("๋ง์์ ๋๋ ๋ญ๊ฐ์ด์ด์ ์นดํธ์ ๋ด์ต๋๋ค.");
}
@Override
public void order() {
System.out.println("๋ญ๊ฐ์ด์ด์ ์ฃผ๋ฌธํฉ๋๋ค.");
}
@Override
public void check() {
System.out.println("๋ญ๊ฐ์ด์ด ์ฃผ๋ฌธ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์๋์ง ํ์ธํฉ๋๋ค.");
}
}
//TimonHealthCategory.java
public class TimonHealthCategory implements Shopping{
@Override
public void find() {
System.out.println("๊ตฌ๋งคํ๋ ค๋ ๋นํ๋ฏผ์ ๊ฒ์ํฉ๋๋ค.");
}
@Override
public void cart() {
System.out.println("๋ง์์ ๋๋ ๋นํ๋ฏผ์ ์นดํธ์ ๋ด์ต๋๋ค.");
}
@Override
public void order() {
System.out.println("๋นํ๋ฏผ์ ์ฃผ๋ฌธํฉ๋๋ค.");
}
@Override
public void check() {
System.out.println("๋นํ๋ฏผ ์ฃผ๋ฌธ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์๋์ง ํ์ธํฉ๋๋ค.");
}
//KoupangFoodCategory.java
public class KoupangFoodCategory implements Shopping{
@Override
public void find() {
System.out.println("๊ตฌ์ด ๋ฌ๊ฑ์ ๊ฒ์ํฉ๋๋ค.");
}
@Override
public void cart() {
System.out.println("์ฐธ๋๋ฌด๋ก ๊ตฌ์ด(...) ๋ฌ๊ฑ์ ์นดํธ์ ๋ด์ต๋๋ค.");
}
@Override
public void order() {
System.out.println("๋ฌ๊ฑ์ ์ฃผ๋ฌธํฉ๋๋ค.");
}
@Override
public void check() {
System.out.println("๋ฌ๊ฑ ์ฃผ๋ฌธ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์๋์ง ํ์ธํฉ๋๋ค.");
}
}
//KoupangHealthCategory.java
public class KoupangHealthCategory implements Shopping{
@Override
public void find() {
System.out.println("๊ตฌ๋งคํ๋ ค๋ ํ๋กํด์ ๊ฒ์ํฉ๋๋ค.");
}
@Override
public void cart() {
System.out.println("๋ง์์ ๋๋ ํ๋กํด์ ์นดํธ์ ๋ด์ต๋๋ค.");
}
@Override
public void order() {
System.out.println("ํ๋กํด์ ์ฃผ๋ฌธํฉ๋๋ค.");
}
@Override
public void check() {
System.out.println("ํ๋กํด ์ฃผ๋ฌธ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์๋์ง ํ์ธํฉ๋๋ค.");
}
}
- Main ํด๋์ค
Main.java
public class Main {
public static void main(String[] args) {
//Timon ์ผํ
ShoppingMall timon = new Timon();
Shopping vitamin = timon.shopping("Health"); //๊ฑด๊ฐ ์นดํ
๊ณ ๋ฆฌ
Shopping chickenBreast = timon.shopping("Food"); // ์๋ฃํ ์นดํ
๊ณ ๋ฆฌ
//Koupang ์ผํ
ShoppingMall koupang = new Koupang();
Shopping protein = koupang.shopping("Health"); //๊ฑด๊ฐ ์นดํ
๊ณ ๋ฆฌ
Shopping roastedEgg = koupang.shopping("Food"); //์๋ฃํ ์นดํ
๊ณ ๋ฆฌ
}
}
์ฅ์ )
- ์์ฑ ํ ํด๋์ค๋ฅผ ๋ฏธ๋ฆฌ ์์ง ๋ชปํด๋ ํฉํ ๋ฆฌ ํด๋์ค๊ฐ ๊ฐ์ฒด์ ์์ฑ์ ๋ด๋น
- ๊ฐ์ฒด์ ์๋ฃํ์ด ํ์ํด๋์ค์ ์ํด ๊ฒฐ์ ๋๋ค -> ํ์ฅ ์ฉ์ด์ฑ
- ๋์ผํ ํํ๋ก ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฅ
- ํ์ฅ์ฑ ์๋ ์ ์ฒด ํ๋ก์ ํธ ๊ตฌ์ฑ ๊ฐ๋ฅ
๋จ์ )
- ์ฌ์ฌ์ฉ์ ๋ฌธ์ = > ๊ฐ์ฒด๊ฐ ๋์ด๋ ๋ ๋ง๋ค ํ์ํด๋์ค ์ฌ์ ์๋ก ์ธํ ๋ถํ์ํ ๋ง์ ํด๋์ค ์์ฑ ๊ฐ๋ฅ์ฑ
๐ ์ ๋ฆฌ
ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ ํด๋์ค๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
๊ฒฐํฉ๋๋ ํด๋์ค์ ๋ณ๊ฒฝํ ๋ถ๋ถ์ด ์๊ฒผ์ ๋ ๋ค๋ฅธ ํด๋์ค์ ์ผ๋ง๋ ์ํฅ์ ์ฃผ๋๊ฐ ์ด๋ค.
ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ ์ฌ์ฉํ๋ฉด ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉํ์ง ์๊ณ ์๋ธ ํด๋์ค์ ์์ํจ์ผ๋ก์จ ํจ์จ์ ์ธ ์ฝ๋ ์ ์ด๋ฅผ ํ ์ ์๊ณ ์์กด์ฑ์ ์ ๊ฑฐํ๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฒฐํฉ๋ ๋ํ ๋ฎ์ถ ์ ์๋ค.
๋ ํผ๋ฐ์ค
- https://dev-youngjun.tistory.com/195
- https://niceman.tistory.com/143
- https://thisisnew-storage.tistory.com/7
- https://velog.io/@ljo_0920/ํฉํ ๋ฆฌ-๋ฉ์๋
'IT' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Annotation(์ด๋ ธํ ์ด์ ) ๋ง๋ค๊ธฐ + spring (0) | 2023.04.21 |
---|---|
์ต์ ๋ฒ ํจํด(Observer pattern) (0) | 2023.02.22 |
ํธ๋์ญ์ (Transaction) (0) | 2022.12.31 |
๋ก๋ ๋ฐธ๋ฐ์ (0) | 2022.12.31 |
์ ๋ค๋ฆญ(Generic)์ด๋? (0) | 2022.12.23 |