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 |