[디자인 모델] 공장 & 공장 방법 & 템 플 릿 방법

3304 단어 디자인 모드
공장: 서로 다른 조건 에 따라 서로 다른 유형의 대상 을 되 돌려 줍 니 다.
 
공장 방법: 하위 클래스 를 통 해 부 류 를 복사 하 는 (추상 적) 방법 으로 구체 적 인 대상 으로 돌아간다.
 
템 플 릿 방법: 일반적인 프로그램 실행 절 차 를 정의 하고 일부 불확실 한 절 차 는 부모 클래스 에서 추상 적 인 방법 으로 정 의 를 내 려 하위 클래스 에 전달 합 니 다.
 
package pattern.factorymethod;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ThreadLocalRandom;

/**
 *   
 *     
 *     
 */
public class FactoryMethod {
	public static void main(String[] args) {
		Game game = GameFactory.createGame("Game");
		game.start();
		
		System.out.println("===================================");
		
		Game magicGame = GameFactory.createGame("MagicGame");
		magicGame.start();
	}
	
}

/**
 *    - Factory
 *        
 */
class GameFactory {
	public static Game createGame(String gameType) {
		Game game = null;
		
		if(gameType==null) {
			throw new IllegalArgumentException("Game can't be null");
		}
		
		if(gameType.startsWith("Game")) {
			game = new Game();
		}
		
		if(gameType.startsWith("MagicGame")) {
			game = new MagicGame();
		}
		
		return game;
	}
}

class Game {
	private Set<Room> rooms = new HashSet<Room>(); 
	
	public Game() {
		init();
	}
	
	/**
	 *     
	 * 	                 
	 * 	         ,             
	 */
	private void init() {
		Room room1 = MakeRoom();
		Room room2 = MakeRoom();
		room1.connect(room2);
		addRoom(room1).addRoom(room2);
	}
	
	private Game addRoom(Room room) {
		rooms.add(room);
		return this;
	}
	
	/**
	 *     -Factory Method
	 *            。
	 *                  。
	 */
	protected Room MakeRoom() {
		return new OrdinaryRoom("OrdinaryRoom"+ThreadLocalRandom.current().nextInt());
	}
	
	public void start() {
		System.out.println("Game start: " + Arrays.toString(rooms.toArray()));
	}
}

abstract class Room {
	String name;
	int capacity = 100;
	abstract void connect(Room otherRoom);
}

class OrdinaryRoom extends Room {
	
	public OrdinaryRoom(String name) {
		super.name = name;
	}
	
	public void connect(Room otherRoom) {
		System.out.println(this.name + " connect to " + otherRoom.name);
	}
	
}

class MagicRoom extends Room {
	public MagicRoom(String name) {
		super.name = name;
		super.capacity = 200;
	}
	public void connect(Room otherRoom) {
		System.out.println(this.name + " connect to " + otherRoom.name);
		System.out.println("Players can see each other with network camera");
	}
	
}

class MagicGame extends Game {

	@Override
	protected Room MakeRoom() {
		return new MagicRoom("MagicRoom"+ThreadLocalRandom.current().nextInt(10));
	}

}

좋은 웹페이지 즐겨찾기