728x90
Step 1
  • 비행기에 연료를 주입하는 형태.
  • main에서 객체 생성 시, 연료를 주입.
interface Fuel{
	String getFuel(); // 연료를 요청하는 함수
}

class water implements Fuel{
	public String getFuel() {
		return "물";
	}
}

class Airplane{
	Fuel fuel;
	public Airplane(Fuel fuel) { this.fuel=fuel; }
	
	void fly() {
		System.out.println(fuel.getFuel()+"로 날다");
	}
}
public class Hello {

	public static void main(String[] args) {
		Airplane airplane = new Airplane(new water());
		airplane.fly();
	}
}

 

Step2
  • 팩토리 메소드 패턴처럼, 객체 생성을 (자식 또는) 다른 클래스에서 하도록 구현
  • main에서 객체 생성을 반환하는 클래스를 객체 생성
interface Fuel{
	String getFuel(); // 연료를 요청하는 함수
}

class water implements Fuel{
	public String getFuel() {
		return "물";
	}
}

class Airplane{
	Fuel fuel;
	public Airplane(Fuel fuel) { this.fuel=fuel; }
	
	void fly() {
		System.out.println(fuel.getFuel()+"로 날다");
	}
}

class Factory{
	
//	// 만드는 방법 1
//	Airplane makeAirplan() { // 비행기 객체를 만들어주는 역햘을 한다.
//		// 물이라는 연료를 사용하도록 한다.
//		Airplane airplane = new Airplane(new water()); // 만드는 것을 공장 안에서 만들겠다.
//		return airplane;
//	}
	
	// 만드는 방법 2
	Airplane Airplan() { // 비행기 객체를 만들어주는 역햘을 한다.
		// 물이라는 연료를 사용하도록 한다.
		Airplane airplane = new Airplane(new water()); // 만드는 것을 공장 안에서 만들겠다.
		return airplane;
	}
}

public class Hello {

	public static void main(String[] args) {
//		Airplane airplane = new Factory().makeAirplan();
		Airplane airplane = new Factory().Airplan();
		airplane.fly();
	}
}

 

Step3
  • 다양한 타입의 객체를 생성하는 클래스를 구현
interface Fuel{
	String getFuel(); // 연료를 요청하는 함수
}

class Water implements Fuel{
	public String getFuel() {
		return "물";
	}
}

class Airplane{
	Fuel fuel;
	public Airplane(Fuel fuel) { this.fuel=fuel; }
	
	void fly() {
		System.out.println(fuel.getFuel()+"로 날다");
	}
}

class Ship{
	Fuel fuel;
	public Ship(Fuel fuel) { this.fuel=fuel; }
}

class Car{
	Fuel fuel;
	public Car(Fuel fuel) { this.fuel=fuel; }
}

class Factory{
	// 만드는 방법 2
	Airplane Airplan() { // 비행기 객체를 만들어주는 역햘을 한다.
		// 물이라는 연료를 사용하도록 한다.
		Airplane airplane = new Airplane(makeFuel()); // 만드는 것을 공장 안에서 만들겠다.
		return airplane;
	}
	Ship Ship() {
		Ship ship = new Ship(makeFuel());
		return ship;
	}
	Car Car() {
		Car car = new Car(makeFuel()); 
		return car;
	}
	Fuel makeFuel() {
		return new Water();
	}
}

public class Hello {

	public static void main(String[] args) {
		Airplane airplane = new Factory().Airplan();
		airplane.fly();
		
		Ship ship = new Factory().Ship();
		Car car = new Factory().Car();
	}
}

 

Step4
  • 'bean'과 같은 형태로 객체 생성을 바로 반환
interface Fuel{
	String getFuel(); // 연료를 요청하는 함수
}

class Water implements Fuel{
	public String getFuel() {
		return "물";
	}
}

class Airplane{
	Fuel fuel;
	public Airplane(Fuel fuel) { this.fuel=fuel; }
	
	void fly() {
		System.out.println(fuel.getFuel()+"로 날다");
	}
}

class Ship{
	Fuel fuel;
	public Ship(Fuel fuel) { this.fuel=fuel; }
}

class Car{
	Fuel fuel;
	public Car(Fuel fuel) { this.fuel=fuel; }
}

class Factory{
	Fuel makeFuel() {
		return new Water();
	}
	
	Airplane Airplane() {
		return new Airplane(makeFuel());
	}
	
	Ship Ship() {
		return new Ship(makeFuel());
	}
	
	Car Car() {
		return new Car(makeFuel()); 
	}
}

public class Hello {

	public static void main(String[] args) {
		Airplane airplane = new Factory().Airplane(); // Airplane 객체를 만들어주는거
		airplane.fly();
		
		Ship ship = new Factory().Ship();
		Car car = new Factory().Car();
	}
}

 

Step5
  • Annotation인 @Configuration과 @Bean을 사용
  • AnnotationConfigApplicationContext을 이용하여 getBean() 함수 이용
interface Fuel{
	String getFuel(); // 연료를 요청하는 함수
}

class Water implements Fuel{
	public String getFuel() {
		return "물";
	}
}

class Airplane{
	Fuel fuel;
	public Airplane(Fuel fuel) { this.fuel=fuel; }
	
	void fly() {
		System.out.println(fuel.getFuel()+"로 날다");
	}
}

class Ship{
	Fuel fuel;
	public Ship(Fuel fuel) { this.fuel=fuel; }
}

class Car{
	Fuel fuel;
	public Car(Fuel fuel) { this.fuel=fuel; }
}

@Configuration
class Factory{
	// 객체를 만들어주세요~ @Bean
	@Bean
	Fuel makeFuel() {
		return new Water();
	}
	
	@Bean
	Airplane Airplane() {
		return new Airplane(makeFuel());
	}
	
	Ship Ship() {
		return new Ship(makeFuel());
	}
	
	Car Car() {
		return new Car(makeFuel()); 
	}
}

public class Hello {

	public static void main(String[] args) {
//		Airplane airplane = new Factory().Airplane(); // Airplane 객체를 만들어주는거
//		airplane.fly();
//		
//		Ship ship = new Factory().Ship();
//		Car car = new Factory().Car();
		
		// Airplane airplane = new Factory().airplane(); // 와 결과는 동일하다.
		AnnotationConfigApplicationContext ctx = 
				new AnnotationConfigApplicationContext(Factory.class);
//		Fuel fuel = ctx.getBean("makeFuel", Fuel.class); 
//		//Fuel fuel = (Fuel)ctx.getBean("makeFuel"); // 위에 코드와 같은 구조이다.
//		System.out.println(fuel.getFuel());
		
		Airplane airplane = ctx.getBean("airplane", Airplane.class); 
		airplane.fly();
		
		ctx.close(); // 리소스 낭비를 막기 위해 close를 해준다.
	}
}

 

Step6
  • Context.xml이라는 생성파일 생성 및 htlm에서 <bean>으로 객체 생성
  • GenericXmlApplicationContext 이용하여 getBean() 함수 이용

Hello.java

interface Fuel{
	String getFuel();
}

class Water implements Fuel{
	public String getFuel() {
		return "물";
	}
}

class Gas implements Fuel{
	public String getFuel() {
		return "가스";
	}
}

class Airplane{
	Fuel fuel;
	public Airplane(Fuel fuel) { this.fuel=fuel; }
	
	void fly() {
		System.out.println(fuel.getFuel()+"로 날다");
	}
}

class Ship{
	Fuel fuel;
	public Ship(Fuel fuel) { this.fuel=fuel; }
	
	void fly() {
		System.out.println(fuel.getFuel()+"로 헤엄치다.");
	}
}

class Car{
	Fuel fuel;
	public Car(Fuel fuel) { this.fuel=fuel; }
	
	void fly() {
		System.out.println(fuel.getFuel()+"로 달리다.");
	}
}

public class Hello {

	public static void main(String[] args) {
		// 외부 XML 파일을 로딩해주어야 한다.
		GenericXmlApplicationContext ctx =
				new GenericXmlApplicationContext("Context.xml"); // 설정 파일을 들고온다.
//		Fuel fuel = ctx.getBean("makeFuel", Water.class);
//		System.out.println(fuel.getFuel());
		
		Airplane airplane = ctx.getBean("airplane", Airplane.class);
		airplane.fly();

		Ship ship = ctx.getBean("ship", Ship.class);
		ship.fly();
		
		Car car = ctx.getBean("car", Car.class);
		car.fly();
	}
}

Context.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

		<!-- @Bean
		Fuel makeFuel() {
			return new Water();
		} -->
		<!-- 함수를 만들고 리턴값은 Water 객체이다. -->
		<bean id="makeWater" class="Pack.Water"/>
		<bean id="makeGas" class="Pack.Gas"/>
		
		
		<!-- @Bean
		Airplane Airplane() {
			return new Airplane(makeFuel());
		} -->
		<bean id="airplane" class="Pack.Airplane">
			<constructor-arg ref="makeWater"/>
		</bean>
		
		
		<bean id="ship" class="Pack.Ship">
			<constructor-arg ref="makeWater"/>
		</bean>
		
		<bean id="car" class="Pack.Car">
			<constructor-arg ref="makeGas"/>
		</bean>
		
</beans>
728x90

'웹 full stack 교육 > 이론' 카테고리의 다른 글

[Spring] Mybatis 와 MySQL  (0) 2021.09.23
[Spring] Mybatis 시작하기  (0) 2021.09.23
[Git] Pull & merge  (0) 2021.09.17
[SQL] PostgreSQL Window에서 실행하기  (0) 2021.09.17
[Spring] 폴더 복제하여 사용하기  (0) 2021.09.17

+ Recent posts