๐Ÿ“ ๋””์ž์ธ ํŒจํ„ด # 2 : ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด, ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด, ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด ๐Ÿ“

bo-yoonยท2021๋…„ 7์›” 4์ผ
0

designpattern

๋ชฉ๋ก ๋ณด๊ธฐ
2/2

๐Ÿ˜ฝ ์ฐธ๊ณ  ๐Ÿ˜ฝ

headfirst designPattern ์„ ์ฐธ๊ณ ํ•˜๊ณ  ํ•™์Šตํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ๋ธ”๋กœ๊ทธ & ๊นƒํ—™์„ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

gmlwjd9405.github.io

OmarElGabry/DesignPatterns

quanke/design-pattern-java-source-code

yaboong.github.io

๐Ÿ˜ผ ์†Œ์Šค ์ฝ”๋“œ ๐Ÿ˜ผ

https://github.com/bo-yoon/DesignPattern

โšฝ๏ธ ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด(๋™์ž‘ ํŒจํ„ด) โšฝ๏ธ

  • ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด์ด๋ž€ ๋ง ๊ทธ๋Œ€๋กœ ํ…œํ”Œ๋ฆฟ, ํ”„๋กœ๊ทธ๋žจ์— ๊ณจ๊ฒฉ์„ ๋งํ•œ๋‹ค. ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ๋™์‹œ์— ๊ฐ์ž ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋‚˜์ค‘์— ์ทจํ•ฉํ•˜๋‹ค๋ณด๋ฉด ์„œ๋กœ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์ด๋‚˜, ๋ณ€ํ•˜์ง€ ์•Š์€ ์•Š๋Š” ๋ถ€๋ถ„ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ๋ฏธ๋ฆฌ ์ •์˜ ํ•ด๋‘๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋Ÿด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด์ด๋‹ค.

  • ์˜ˆ๋ฅผ ๋“ค์–ด ResponseDTO ๊ฐ™์€ ๊ฒฝ์šฐ ๊ณตํ†ต ์‘๋‹ต ๋ถ€๋ถ„ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋ฏธ๋ฆฌ ์ •์˜ ํ•ด๋†“๊ณ  ์‹œ์ž‘ํ•œ๋‹ค.

  • ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด์—๋Š” ํ›„ํฌ ๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ํ›„ํฌ๋Š” ์ถ”์ƒํด๋ ˆ์Šค์—์„œ ๊ฐ„๋‹จํ•œ ๊ธฐ๋ณธ์ ์ธ ๋‚ด์šฉ์ด ๊ตฌํ˜„๋˜์–ด ์žˆ๊ฑฐ๋‚˜, ์•„๋ฌด ์ฝ”๋“œ๋„ ๊ตฌํ˜„ ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ๋งํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ถ”์ƒ ํด๋ ˆ์Šค๋ฅผ ์ƒ์† ๋ฐ›์€ ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์—ฌ๊ธฐ์— ์ถ”๊ฐ€์ ์ธ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

์†Œ์Šค ์ฝ”๋“œ


package templeteMethod;

public abstract class AbstractDoit {
	
	protected abstract void primitive();
	
	protected abstract void hook();
	
	public void templeteMethod() {
		
		primitive();
		hook();
		
	}
}

package templeteMethod;

public class WeekDayDoit extends AbstractDoit {
	
	@Override
	protected void primitive() {
		System.out.println("์ง‘๊ฐ€์„œ ์ž ์ž๊ธฐ ");
		System.out.println("๊ฒŒ์ž„ ํ•œ ํŒ ");
	}
	
	@Override
	protected void hook() {
		System.out.println("๊ทธ์ „์— ํ‡ด๊ทผ ๋จผ์ €");
	}
}

package templeteMethod;

public class Main {
	public static void main(String [] args) {
		
		AbstractDoit todo = new WeekDayDoit();
		todo.templeteMethod();
	}
}

โšฝ๏ธ ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด (์ƒ์„ฑ ํŒจํ„ด)โšฝ๏ธ

  • ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์€ ์œ„์—์„œ ์†Œ๊ฐœํ•œ ํƒฌํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์ด๋‹ค. ๋จผ์ € ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์—ญํ• ์„ ํ•˜์œ„ ํด๋ž˜์Šค์—๊ฒŒ ๋งก๊ธด๋‹ค. ์ฆ‰, ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜๋‚˜์˜ ํŒฉํ† ๋ฆฌ์—์„œ ํ•œ ๊ฐœ์˜ ๋ฉ”์†Œ๋“œ๋กœ ์ƒ์„ฑ์„ ํ•˜๋Š”๋ฐ ์ด ์•ˆ์—๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์˜ ๋ชฉ์ ์€ ๊ทธ๋ฆผ ์ƒ์—์„œ ConcreteCreator์™€ Product์˜ ์˜์กด์„ฑ์„ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์œผ๋กœ, ๋‹จ์ผ ๋ฉ”์„œ๋“œ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค. ์ด๊ฒƒ์ด ์•„๋ž˜ ์†Œ๊ฐœํ•  ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด๊ณผ ์ฐจ์ด๋‚˜๋Š” ์ ์ด๋‹ค.

์†Œ์Šค ์ฝ”๋“œ

package factoryMethod;

public class StrawberryJuice {


	public void flavor() {
		System.out.println("๋”ธ๊ธฐ ๋ง› ์ฅฌ์Šค");
	}
}

public abstract class DrinkFactory {
	abstract StrawberryJuice maker(String juice);
}
package factoryMethod;

public class JuiceFactory extends DrinkFactory{
	
	public Juice maker(String juice) {
		
		if(juice.equals("STRAWBERRY")) {
			return new StrawberryJuice();
		}
		
		return null;
		
	}
}

โšฝ๏ธ ์ถ”์ƒ ํŒฉํ† ๋ฆฌ ํŒจํ„ด (์ƒ์„ฑ ํŒจํ„ด) โšฝ๏ธ

  • ํŒฉํ† ๋ฆฌ ํด๋ž˜์Šค์— ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ด๋‹ค. ์ฆ‰, ํ•˜๋‚˜์˜ ํŒฉํ† ๋ฆฌ๋Š” ๊ฐ€๊ณ„์˜ ์„ธํŠธ ๋งค๋‰ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด๋œ๋‹ค.

  • ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ด์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์†Œ์Šค ์ฝ”๋“œ


package abstFactory;

public interface BeverageFactory {
	
	public Beverage maker(String kind);
}

package abstFactory;

public class CoffeeFactory implements BeverageFactory {
	
	@Override
	public Beverage maker(String kind) {
		 
			kind =  kind.toUpperCase();
			
			if(kind.equals("AMERICANO")) {
				return new Americano();
			}
		
			return null;
	}
}


package abstFactory;

public class JuiceFactory implements BeverageFactory {
	
	@Override
	public Beverage maker(String kind) {
		kind = kind.toUpperCase();
		
		if(kind.equals("STRAWBERRY")) {
			return new StrawberryJuice();
		}else if(kind.equals("BANANA")){
			return new BananaJuice();
		}
		
		return null;
		
	}
}


package abstFactory;

public interface Beverage {

	public void flavor();
}


package abstFactory;

public abstract class Coffee implements Beverage{
	

}


package abstFactory;


public class Americano extends Coffee {
	
	@Override
	public void flavor() {
		System.out.println("์•„๋ฉ”๋ฆฌ์นด๋…ธ~ ์ข‹์•„ ์ข‹์•„ ์ข‹์•„~");
	}
}
package abstFactory;

public abstract class Juice implements Beverage {

}
package abstFactory;

public class BananaJuice extends Juice{
	
	@Override
	public void flavor() {
		System.out.println("๋ฐ”๋‚˜๋‚˜ ๋ง› ์ฃผ์Šค!");
	}
}



package abstFactory;

public class BananaJuice extends Juice{
	
	@Override
	public void flavor() {
		System.out.println("๋ฐ”๋‚˜๋‚˜ ๋ง› ์ฃผ์Šค!");
	}
}


package abstFactory;

public class Main {
	public static void main(String [] args) {
		
		BeverageFactory fac = new CoffeeFactory();
		
		Beverage coffee = fac.maker("americano");
		
		coffee.flavor();
		
		fac = new JuiceFactory();
		
		Beverage juice = fac.maker("banana");
		juice.flavor();
		
		
		
	}
}
์•„๋ฉ”๋ฆฌ์นด๋…ธ~ ์ข‹์•„ ์ข‹์•„ ์ข‹์•„~
๋ฐ”๋‚˜๋‚˜ ๋ง› ์ฃผ์Šค!
profile
๊ฐœ๋ฐœ ๋กœ๊ทธ ๐ŸŽ ๐ŸŽ ๐ŸŽ

0๊ฐœ์˜ ๋Œ“๊ธ€