์ ์
- ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ์๋ธ ํด๋์ค์์ ์ด๋ค ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ง ๊ฒฐ์ ํ๋ ํจํด์ด๋ค. ์ฆ, ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ์ผ์ ์๋ธํด๋์ค์๊ฒ ๋งก๊ธฐ๋๊ฒ์ด๋ค.
- ํฉํ ๋ฆฌ ํจํด์ 'ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด'๊ณผ '์ถ์ ํฉํ ๋ฆฌ ํจํด'์ผ๋ก ๋๋๋ค.
- ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด : ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๊ณ , ์ด๋ค ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ง๋ ์๋ธ ํด๋์ค์์ ๊ฒฐ์ ํ๋ค.
- ์ถ์ ํฉํ ๋ฆฌ ํจํด : ์ถ์ ํฉํ ๋ฆฌ ํจํด์ ๋ง์ ์์ ์ฐ๊ด๋ ์๋ธ ํด๋์ค๋ฅผ ํน์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด ํ๋ฒ์ ๊ต์ฒดํ ์ ์๋๋ก ๋ง๋ ๋์์ธ ํจํด์ด๋ค.
์ฅ์
- ์๋ก์ด ๊ตฌํ ํด๋์ค๊ฐ ์ถ๊ฐ๋์ด๋ ๊ธฐ์กด Factory์ฝ๋์ ์์ ์์ด ์๋ก์ด Factory๋ฅผ ์ถ๊ฐํ๋ฉด ๋๋ค -> OCP์์น์ ์งํฌ ์ ์๋ค.
- ๊ตฌ์ฒด์ ์ธ ํด๋์ค๋ฅผ ์ถ์ํ๋ผ๋ ํน์ง์ ์ ๊ณตํด ์ฌ์ฉ์๋ก๋ถํฐ ๋ถ๋ฆฌํ ์ ์๋ค. ->์ฌ์ฉ์๊ฐ ์ฌ์ฉํ ๋๋ ์ธํฐํ์ด์ค์ ์ ์๋ ์ถ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
- ๊ฐ์ฒด๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์๋ค.
*OCP(Open-Closed Principle)์์น :
๊ธฐ์กด์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์๋๋ก ์ค๊ณ๊ฐ ๋์ด์ผํ๋ค๋ ์์น.
ํ์ฅ์ ๋ํด์๋ ๊ฐ๋ฐฉ์ ์ด๊ณ , ์์ ์ ๋ํด์๋ ํ์์ ์ด์ด์ผ ํ๋ค. ์์ ์ ๋ํด์ ํ์์ ์ด๋ค๋ ๋ง์ ์ฝ๋๋ฅผ ์์ ํ์ง ์์๋ ๋ชจ๋์ ๊ธฐ๋ฅ์ ํ์ฅํ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์์ด์ผํ๋ค๋ ๋ง์ด๋ค. ๊ฐ๋ฐฉ ํ์์ ์์น ์ด๋ผ๊ณ ๋ ํ๋ค.
๋จ์
- ํจํด์ ๊ตฌํํ ๋ง์ ์๋ธ ํด๋์ค๋ฅผ ์ ์ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฝ๋๋์ด ์ฆ๊ฐํ ์ ์๋ค.
- ์๋ก์ด ์ข ๋ฅ์ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๊ธฐ ์ด๋ ต๋ค. ๋ง์ฝ Factory์ฝ๋์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ฉ์๋๊ฐ ์ถ๊ฐ๋๋ค๋ฉด Factory์ ๋ชจ๋ ์๋ธ๊ตฌํ์ฒด๋ฅผ ๋ค์ ์์ ํด์ผํ๋ค.
ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด ์์
public interface PhoneFactory {
default Phone orderPhone() {
Phone phone = createPhone();
phone.complete();
return phone;
}
Phone createPhone();
}
public class IPhoneFactory implements PhoneFactory {
@Override
public Phone createPhone() {
return new IPhone();
}
}
public class AndroidPhoneFactory implements PhoneFactory {
@Override
public Phone createPhone() {
return new AndroidPhone();
}
}
public interface Phone {
void complete();
void call();
}
public class IPhone implements Phone{
@Override
public void complete() { System.out.println("์์ดํฐ ์์ฑ"); }
@Override
public void call() { System.out.println("์์ดํฐ์ผ๋ก ์ ํ๋ฅผ ํ๋ค"); }
}
public class AndroidPhone implements Phone{
@Override
public void complete() {System.out.println("์๋๋ก์ด๋ํฐ ์์ฑ");}
@Override
public void call() {System.out.println("์๋๋ก์ด๋ํฐ์ผ๋ก ์ ํ๋ฅผ ํ๋ค");}
}
public class Practice {
public static void main(String[] args){
IPhoneFactory iPhoneFactory = new IPhoneFactory();
Phone phone7 = iPhoneFactory.orderPhone();
phone7.call();
AndroidPhoneFactory androidPhoneFactory = new AndroidPhoneFactory();
Phone phone2 = androidPhoneFactory.orderPhone();
phone2.call();
}
}
//๊ฒฐ๊ณผ
์์ดํฐ ์์ฑ
์์ดํฐ์ผ๋ก ์ ํ๋ฅผ ํ๋ค
์๋๋ก์ด๋ํฐ ์์ฑ
์๋๋ก์ด๋ํฐ์ผ๋ก ์ ํ๋ฅผ ํ๋ค
SimplePhoneFactory๋ฅผ ์ธํฐํ์ด์คํํ๊ณ ์๋ธํด๋์ค๋ IPhoneFactory, AndroidPhoneFactory๋ฅผ ๋ง๋ ๋ค. ์๋ธํด๋์ค์ createPhone()์ ํตํด ๊ฐ์์ Factory์์ Phone ๊ฐ์ฒด ์์ฑ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ ๋ค. ์ด๋ ๊ฒ Factory๋ฅผ ์์ํ ์๋ธํด๋์ค์์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ฒ๋ ํ ์ ์๋ค.
์ถํ์ ํฐ์ ์ข ๋ฅ๊ฐ ์ฌ๋ฌ๊ฐ๋ก ๋์ด๋๋ Phone ์๋ธ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ createPhone()์ ์ฒ๋ฆฌ๋ง ํด์ฃผ๋ฉด ํ์ฅ๊ฐ๋ฅํ ๊ตฌ์กฐ๊ฐ ๋๋ค.(OCP๋ฅผ ๋ฐ๋ฅด๊ฒ ๋๋ค)
์ถ์ ํฉํ ๋ฆฌ ํจํด ์์
์์ดํฐ์ IOS๋ฅผ, ์๋๋ก์ด๋ํฐ์๋ Google Os๋ฅผ ์ค์นํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์๋ค.
public interface PhoneFactoryOfFactory {
PhoneFactory requestPhone(String company);
}
public class DefaultPhoneFactoryOfFactory implements PhoneFactoryOfFactory{
@Override
public PhoneFactory requestPhone(String company) {
switch (company) {
case "IPHONE":
return new IPhoneFactory();
case "ANDROID":
return new AndroidPhoneFactory();
}
throw new IllegalArgumentException();
}
}
///
///
public interface PhoneFactory {
Phone createPhone();
OS createOS();
}
public class IPhoneFactory implements PhoneFactory{
@Override
public Phone createPhone() {
OS os = createOS();
os.installOS();
return new IPhone();
}
@Override
public OS createOS() {
return new IOS();
}
}
public class AndroidPhoneFactory implements PhoneFactory{
@Override
public Phone createPhone() {
OS os = createOS();
os.installOS();
return new AndroidPhone();
}
@Override
public OS createOS() {
return new GoogleOS();
}
}
///
///
public interface OS {
void installOS();
}
public class IOS implements OS {
@Override
public void installOS() {
System.out.println("IOS ์ค์น");
}
}
public class GoogleOS implements OS {
@Override
public void installOS() {
System.out.println("๊ตฌ๊ธOS ์ค์น");
}
}
///
///
public interface Phone {
public void call();
public void playGame();
}
public class IPhone implements Phone{
@Override
public void call() {
System.out.println("์์ดํฐ์ผ๋ก ์ ํํ๋ค");
}
@Override
public void playGame() {
System.out.println("์์ดํฐ์ผ๋ก ๊ฒ์ํ๋ค");
}
}
public class AndroidPhone implements Phone{
@Override
public void call() {
System.out.println("์๋๋ก์ด๋๋ก ์ ํํ๋ค");
}
@Override
public void playGame() {
System.out.println("์๋๋ก์ด๋๋ก ๊ฒ์ํ๋ค");
}
}
///
public class Main {
public static void main(String[] args) {
PhoneFactoryOfFactory phoneFactoryOfFactory = new DefaultPhoneFactoryOfFactory();
PhoneFactory iphoneFactory= phoneFactoryOfFactory.requestPhone("IPHONE"); //์์ดํฐ์ ์ฐ๋ค.
Phone iphone = iphoneFactory.createPhone();
iphone.call();
iphone.playGame();
PhoneFactory androidPhoneFactory = phoneFactoryOfFactory.requestPhone("ANDROID"); //์๋๋ก์ด๋ํฐ์ ์ฐ๋ค.
Phone androidPhone = androidPhoneFactory.createPhone();
androidPhone.call();
androidPhone.playGame();
}
}
//๊ฒฐ๊ณผ
IOS ์ค์น
์์ดํฐ์ผ๋ก ์ ํํ๋ค
์์ดํฐ์ผ๋ก ๊ฒ์ํ๋ค
๊ตฌ๊ธOS ์ค์น
์๋๋ก์ด๋๋ก ์ ํํ๋ค
์๋๋ก์ด๋๋ก ๊ฒ์ํ๋ค
ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด ์์ ์์๋ PhoneFactory์ ์๋ธํด๋์ค IPhoneFactory, AndroidPhoneFactory๊ฐ ๊ฐ๊ฐ IPhone ๊ฐ์ฒด AndroidPhone ๊ฐ์ฒด ํ๋์ฉ ์์ฑํ๋ค.
์ถ์ ํฉํ ๋ฆฌ ํจํด ์์ ์์ ํ๋์ PhoneFactory์์ ์ฌ๋ฌ๊ฐ์ ์ ํ๊ตฐ(Phone, OS) ์กฐํฉ์ ์์ฑํ ์ ์๊ฒ ํด์ค๋ค.
์ดํดํ๋๋ฐ ํฐ ๋์์ ์ค ๊ฒ์๊ธ :
'๋์์ธํจํด ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฑ๊ธํค(Singleton) ํจํด (0) | 2023.01.31 |
---|