본문 바로가기

Java/java 기초

자바 디자인 패턴 - Factory Pattern

Weapon 인터페이스 

package weapon;

public interface Weapon {
	public void drawWeapon();
}

 

Weapon을 implements 한 Sword

package weapon;

public class Sword implements Weapon {

	@Override
	public void drawWeapon() {
		System.out.println("무기: Sword");
		
	}
	
}

Weapon을 implements 한 Gun

package weapon;

public class Gun implements Weapon{

	@Override
	public void drawWeapon() {
		System.out.println("무기: Gun");
		
	}
	
}

 

 

Bomb 인터페이스 

 

 

package bomb;

public interface Bomb {
	public void drawBomb();
}

 

 

 

Bomb를  implements 한 C4

package bomb;

public class C4 implements Bomb {

	@Override
	public void drawBomb() {
		System.out.println("폭탄: C4");
	}

}

 

 

Bomb를  implements 한 Dynamite

 

package bomb;

public class Dynamite implements Bomb {

	@Override
	public void drawBomb() {
		System.out.println("폭탄: Dynamite");
	}

}

 

 

AbstractItem 인터페이스

Weapon 과 Bomb를 생성할수 있도록 지정 해둔다.

 

package types;

import bomb.Bomb;
import weapon.Weapon;

public interface AbstractItem {
	
	public Weapon createWeapon();
	public Bomb createBomb();
	
}

 

 

AbstractItem를 implements 한 AType 

 

createWeapon및 createBomb를  활용해 해당 메소드 실행시 새로운 생성자 가 생성된다.

package types;

import bomb.Bomb;
import bomb.Dynamite;
import weapon.Gun;
import weapon.Weapon;

public class Atype implements AbstractItem {

	@Override
	public Weapon createWeapon() {
		return new Gun();
	}

	@Override
	public Bomb createBomb() {
		return new Dynamite();
	}

}

AbstractItem를 implements 한 BType

package types;

import bomb.Bomb;
import bomb.C4;
import weapon.Sword;
import weapon.Weapon;

public class BType implements AbstractItem {

	@Override
	public Weapon createWeapon() {
		return new Sword();
	}

	@Override
	public Bomb createBomb() {
		return new C4();
	}

}

 

Person Class

 

값을 가져올수 있는 getter 지정 및 

AbstractItem 을 인자로 받아서 weapon 은 createweapon bomb 는 createBomb를 통해  폭탄 클래스를 생성  할 수 있도록 한다

package person;

import java.util.ArrayList;

import bomb.Bomb;
import types.AbstractItem;
import weapon.Weapon;

public class Person {
	// get set을 생성해야 한다
	private Weapon m_Weapon;
	private Bomb m_Bomb;

	public Weapon getM_Weapon() {
		return m_Weapon;
	}

	public Bomb getM_Bomb() {
		return m_Bomb;
	}

	public void create(AbstractItem aw) {
		m_Weapon = aw.createWeapon();
		m_Bomb = aw.createBomb();
	}

}

 클래스

Person 값을 ArrayList에 추가해준다.

 

human1 생성 -> human1의 create를 통해 (new Atype) 선언해준다 -> 배열에 추가 

배열의 인덱스 값을 받아서 무기를 받아 무기를 나타낸다.

package main;

import java.util.ArrayList;

import person.Person;
import types.Atype;
import types.BType;
import types.CType;

public class mainClass {
	public static void main(String[] args) {
		
		ArrayList<Person> arr = new ArrayList<Person>();
		
		Person human1 = new Person();
		human1.create(new AType());
		arr.add(human1);
		
		Person human2 = new Person();
		human2.create(new BType());
		arr.add(human2);
		
		for (int i = 0; i < arr.size(); i++) {
			arr.get(i).getM_Weapon().drawWeapon();
			arr.get(i).getM_Bomb().drawBomb();
			System.out.println();
		}
		
	}
}