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는 하나
모든 로봇은 기본적으로 걷고, 달릴 수 있다
로봇 모양은 팔, 다리, 머리, 몸통
Super 로봇 : 날 수 O. 미사일을 쏠 수 O. 레이저검.
Standard로봇: 날 수 X. 미사일을 쏠 수 O. 목검
Low 로봇 : 날 수 X. 미사일을 쏠 수 X. 검 없음.
위 3가지 형태의 로봇을 만들어 보도록 하고, 추후 로봇들은 새로 만들어질 수도 있고, 업그레이드 되어질 경우를 생각하여 유연한 프로그램 만들기
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;
}
}
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());
}
}
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());
}
}
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());
}
}
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 부품을 '장난감 검이 있습니다'기능으로 업그레이드
장난감 검이 있습니다