박은종의 객체지향 설계를 위한 디자인패턴 with 자바
디자인패턴 2 - 하위클래스에 위임하기 : 템플릿 패턴 , 팩토리 패턴
1. 템플릿 메소드 패턴 - 구체적인 처리를 하위 클래스에 위임
객체의 레벨(템플릿) 변화에 따른 플레이어 상태(템플릿) 변화
객체의 레벨 상태에 따라 플레이서 상태(템플릿)변화를 하위클래스에 위임
- 템플릿 메소드는 코드 재사용을 위한 기본 기술
- 프레임워크에서 가장 많이 사용되는 패턴 중 하나
- 클래스의 공통부분을 분리하는 기능 제공
- 템플릿 메서드에서 사용하는 오퍼레이션들AbstractClass 에 정의된 오퍼레이션 중 구체적인 알고리즘을 가지고 있는 오퍼레이션훅 오퍼레이션
- 기본 오퍼레이션으로 추상화된 오퍼레이션
- ConcreteClass 오퍼레이션이나 클라이언트 클래스에 정의된 오퍼레이션
public abstract class PlayerLevel {
public abstract void run();
public abstract void jump();
public abstract void turn();
public abstract void showLevelMessage();
final public void go(int count)
{
run();
for(int i=0; i<count; i++){
jump();
}
turn();
}
}
public class BeginnerLevel extends PlayerLevel{
@Override
public void run() {
System.out.println("천천히 달립니다.");
}
@Override
public void jump() {
System.out.println("Jump 할 줄 모르지롱.");
}
@Override
public void turn() {
System.out.println("Turn 할 줄 모르지롱.");
}
@Override
public void showLevelMessage() {
System.out.println("***** 초보자 레벨 입니다. *****");
}
}
public class AdvancedLevel extends PlayerLevel{
@Override
public void run() {
System.out.println("빨리 달립니다.");
}
@Override
public void jump() {
System.out.println("높이 jump 합니다.");
}
@Override
public void turn() {
System.out.println("Turn 할 줄 모르지롱.");
}
@Override
public void showLevelMessage() {
System.out.println("***** 중급자 레벨 입니다. *****");
}
}
public class SuperLevel extends PlayerLevel{
@Override
public void run() {
System.out.println("엄청 빨리 달립니다.");
}
@Override
public void jump() {
System.out.println("아주 높이 jump 합니다.");
}
@Override
public void turn() {
System.out.println("한 바퀴 돕니다.");
}
@Override
public void showLevelMessage() {
System.out.println("***** 고급자 레벨 입니다. *****");
}
}
public class Player {
private PlayerLevel level;
public Player()
{
level= new BeginnerLevel();
level.showLevelMessage();
}
public PlayerLevel getLevel() {
return level;
}
public void upgradeLevel(PlayerLevel level) {
this.level = level;
level.showLevelMessage();
}
public void play(int count){
level.go(count);
}
}
public class MainBoard {
public static void main(String[] args) {
Player player = new Player();
player.play(1);
AdvancedLevel aLevel = new AdvancedLevel();
player.upgradeLevel(aLevel);
player.play(2);
SuperLevel sLevel = new SuperLevel();
player.upgradeLevel(sLevel);
player.play(3);
}
}
2. 팩토리 메소드 패턴 - 인스턴스의 생성을 하위 클래스에 위
- 객체를 생성하기 위한 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스에서 결정하게 함.
- 여러 상황에 따라 각각 생성될 수 있는 객체에 대한 생성을 하위 클래스에 위임
- 생성과 관련된 동일한 메서드는 상위 클래스에서 처리
상황에 따라 다양한 인스턴스 생성을 할 수 있음
객체의 공장에서(자동차 공장) 객체(자동차)를 생산
생산하면서 하위클래스에 객체의 종류(소나타,산타페)를 위임하여 선택가능
public abstract class Car {
String carType;
public String toString() {
return carType;
}
}
public abstract class CarFactory {
public abstract Car createCar(String name); // add - on
public abstract Car returnMyCar(String name);
}
public class HyundaiFactory extends CarFactory{
HashMap<String, Car> carMap = new HashMap<String, Car>();
@Override
public Car createCar(String name) {
Car car = null;
if (name == "sonata") {
car = new Sonata();
}
else if( name == "santafe") {
car = new Santafe();
}
return car;
}
@Override
public Car returnMyCar(String name) {
// Jame는 Sonata, Tomas는 Santafe 인 경우
Car myCar = carMap.get(name);
if(myCar == null) {
if(name.equals("James")){
myCar = new Sonata();
}
else if(name.equals("Tomas") ){
myCar = new Santafe();
}
carMap.put(name, myCar);
}
return myCar;
}
}
public class Sonata extends Car{
Sonata(){
carType = "Sonata";
}
}
public class Santafe extends Car{
Santafe(){
carType = "Santafe";
}
}
public class CarTest {
public static void main(String[] args) {
CarFactory factory = new HyundaiFactory();
Car newCar = factory.createCar("sonata");
System.out.println(newCar);
Car myCar = factory.returnMyCar("Tomas");
Car hisCar = factory.returnMyCar("Tomas");
System.out.println(myCar == hisCar);
}
}
LIST
'4차산업혁명의 일꾼 > Java&Spring웹개발과 서버 컴퓨터' 카테고리의 다른 글
파이썬프로그래밍 기초 (0) | 2023.02.23 |
---|---|
디자인패턴 3 - 기능의 선언과 구현을 분리하여 생각하기 (0) | 2023.02.21 |
디자인 패턴 1- 클래스의 인스턴스를 생성 -(Singleton Pattern,Prototype Pattern,abstract Factory Pattern,Builder Pattern : 싱글톤, 프로토타입, 공장, 빌더) (0) | 2023.02.19 |
클린코드 - 애자일소프트 장인정신 1 - 5가지 정신 (0) | 2023.02.19 |
내 인생 처음이자 마지막 자바 & 객체지향 프로그래밍 정리 (0) | 2023.02.18 |