Pattern(패턴)

JK·2022년 12월 24일
0

JAVA

목록 보기
16/28
post-thumbnail

패턴(디자인패턴)

1. 싱글톤 패턴(Singleton pattern)

  • 어떤 클래스의 객체는 오직 하나인 유일한 객체를 만들어 여러가지 상황에서 동일한 객체에 접근하기 위해 만들어진 패턴
  • 위키백과 曰, 싱글턴 패턴(Singleton pattern)을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 이 객체에 접근할 수 있는 전역적인 접촉점을 제공하는 패턴이다.

예제

package singleton1;

public class Single {
	private int i;

	private Single() {}  //매개변수 없는 Single 생성자   

	private static Single INSTANCE = new Single();  

	public static Single getInstance() {
		// 생성된 객체 주소를 return
		return INSTANCE;
	}

	public int getI() {
		return i;
	}

	public void setI(int i) {
		this.i = i;
	}
}
package singleton1;

public class SingleMain {

	public static void main(String[] args) {
		Single obj1 = Single.getInstance();
		Single obj2 = Single.getInstance();
		obj1.setI(99);
		System.out.println(obj1.getI());
		System.out.println(obj2.getI());
		if(obj1.equals(obj2)) {
			System.out.println("obj1과obj2는 하나");
		}
	}
}
  • 결과
99
99
obj1과obj2는 하나

2. 스트래티지 패턴(Strategy Pattern)

  • 기능 하나를 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다
  • 스트래티지를 활용하면 기능을 사용하는 클라이언트와는 독립적으로 기능을 변경 가능
  • 어떤 객체를 만들 때 객체가 가지는 기능들을 추상화하여 기능을 부품화, 표준화 하는 것

예제. 로봇만들기

모든 로봇은 기본적으로 걷고, 달릴 수 있다
로봇 모양은 팔, 다리, 머리, 몸통

Super 로봇 : 날 수 O. 미사일을 쏠 수 O. 레이저검.
Standard로봇: 날 수 X. 미사일을 쏠 수 O. 목검
Low 로봇 : 날 수 X. 미사일을 쏠 수 X. 검 없음.

위 3가지 형태의 로봇을 만들어 보도록 하고, 추후 로봇들은 새로 만들어질 수도 있고, 업그레이드 되어질 경우를 생각하여 유연한 프로그램 만들기

1. Robot

package strategy1_step5.modularization;

import strategy1_step4.interfaces.FlyImpl;
import strategy1_step4.interfaces.KnifeImpl;
import strategy1_step4.interfaces.MissileImpl;

public class Robot {
	private FlyImpl fly;
	private MissileImpl missile;
	private KnifeImpl knife;

	public void actionWalk() {
		System.out.println("걸을 수 있습니다");
	}

	public void actionRun() {
		System.out.println("뛸 수 있습니다");
	}

	public void shape() {
		String className = getClass().getName(); // 클래스 이름
		int idx = className.lastIndexOf("."); // idx 는 클래스 이름의 .이다
		String name = className.substring(idx + 1); // name 은 클래스 이름의 . +1 부터이다
		System.out.println(name + "의 외형은 팔, 다리, 몸통, 머리가 있습니다");
	}

	public void actionFly() {
		fly.fly();
	}

	public void actionMissile() {
		missile.missile();
	}

	public void actionKnife() {
		knife.knife();
	}

	public void setFly(FlyImpl fly) {
		this.fly = fly;
	}

	public void setMissile(MissileImpl missile) {
		this.missile = missile;
	}

	public void setKnife(KnifeImpl knife) {
		this.knife = knife;
	}
}

2. LowRobot

package strategy1_step5.modularization;

import strategy1_step4.interfaces.FlyNo;
import strategy1_step4.interfaces.KnifeNo;
import strategy1_step4.interfaces.MissileNo;

public class LowRobot extends Robot {
	
	public LowRobot() {
		setFly(new FlyNo());
		setMissile(new MissileNo());
		setKnife(new KnifeNo());
	}
}

3. StandardRobot

package strategy1_step5.modularization;

import strategy1_step4.interfaces.FlyNo;
import strategy1_step4.interfaces.KnifeWood;
import strategy1_step4.interfaces.MissileYes;

public class StandardRobot extends Robot {

	public StandardRobot() {
		setFly(new FlyNo());
		setMissile(new MissileYes());
		setKnife(new KnifeWood());
	}
}

4. SuperRobot

package strategy1_step5.modularization;

import strategy1_step4.interfaces.FlyYes;
import strategy1_step4.interfaces.KnifeLazer;
import strategy1_step4.interfaces.MissileYes;

public class SuperRobot extends Robot {
	
	public SuperRobot() {
		setFly(new FlyYes());
		setMissile(new MissileYes());
		setKnife(new KnifeLazer());
	}
}

5. TestMain

package strategy1_step5.modularization;

import strategy1_step4.interfaces.FlyHigh;
import strategy1_step4.interfaces.KnifeToy;

public class TestMain {
	public static void main(String[] args) {
		Robot[] robots = {new SuperRobot(), new StandardRobot(), new LowRobot()};
//		SuperRobot superRobot = new SuperRobot();
//		StandardRobot standardRobot = new StandardRobot();
//		LowRobot lowRobot = new LowRobot();
//		Robot[] robots = { superRobot, standardRobot, lowRobot };
		for (Robot robot : robots) {
			robot.shape();
			robot.actionRun();
			robot.actionWalk();
			robot.actionFly();
			robot.actionMissile();
			robot.actionKnife();
		}
		System.out.println("SuperRobot의 나는 부품을 높이 아주 높이 나는 기능 업그레이드");
		robots[0].setFly(new FlyHigh());
		robots[0].shape();
		robots[0].actionFly();
		System.out.println("LowRobot의 knife 부품을 '장난감 검이 있습니다'기능으로 업그레이드");
		robots[2].setKnife(new KnifeToy());
		robots[2].actionKnife();
	}
}

- 결과

SuperRobot의 외형은 팔, 다리, 몸통, 머리가 있습니다
뛸 수 있습니다
걸을 수 있습니다
날 수 있습니다
미사일을 쏠 수 있습니다
레이저 검이 있습니다
StandardRobot의 외형은 팔, 다리, 몸통, 머리가 있습니다
뛸 수 있습니다
걸을 수 있습니다
날 수 없습니다
미사일을 쏠 수 있습니다
목검이 있습니다
LowRobot의 외형은 팔, 다리, 몸통, 머리가 있습니다
뛸 수 있습니다
걸을 수 있습니다
날 수 없습니다
미사일을 쏠 수 없습니다
검이 없습니다
SuperRobot의 나는 부품을 높이 아주 높이 나는 기능 업그레이드
SuperRobot의 외형은 팔, 다리, 몸통, 머리가 있습니다
높이 아주 높이 날 수 있습니다
LowRobot의 knife 부품을 '장난감 검이 있습니다'기능으로 업그레이드
장난감 검이 있습니다
profile
씨앗 개발자

0개의 댓글