ООП для чайников. Паттерны проектирования. Строитель (Builder)

Предыдущий опыт показал что скриптовые языки не очень подходят для иллюстрации паттернов и дальше мы ограничились использованием ООП языков со строгой типизацией, так сказать, для большей наглядности.

Сегодня речь пойдет о паттерне Строитель, предназначенного для конструирования объектов.
Если процесс создания какого либо сложного объекта из составных имеет схожие этапы, имеет смысл описать единый алгоритм создания включающий в себя действия по созданию необходимого объекта.

Вот как это выглядит в UML:

builder

В моем простом примере логика создания простой игровой карты выносится в класс строителя WorldBuilder, в котором реализовано два метода для создания пустого мира и со случайно расставленными стенами.


// IPlace.java

package patterns.builder.map;

public interface IPlace {
	
	public String render();

}

// FloorPlace.java

package patterns.builder.map;


public class FloorPlace implements IPlace {

	@Override
	public String render() {
		return ".";
	}

}

// WallPlace.java

package patterns.builder.map;

public class WallPlace implements IPlace {

	@Override
	public String render() {		
		return "#";
	}

}

// World.java

package patterns.builder.map;


public class World {
	
	private IPlace[][] places;
	private int WIDTH;
	private int HEIGHT;
	
	public World(int width, int height) {
		WIDTH = width;
		HEIGHT = height;
		places = new IPlace[WIDTH][HEIGHT];
	}
	
	public int getWidth() {
		return WIDTH;
	}
	
	public int getHeight() {
		return HEIGHT;
	}
	
	public void setPlace(int x, int y, IPlace place) {
		places[x][y] = place;
	}
	
	public void render() {
		for(int y = 0; y < HEIGHT; y++) {
			for(int x = 0; x < WIDTH; x++) {
				System.out.print(places[x][y].render());
			}			
			System.out.println();
		}
	}
	
}

// WorldBuilder.java

package patterns.builder.map;


public class WorldBuilder {
	
	private World world;
	
	public WorldBuilder(World world) {
		this.world = world;
	}
	
	public void createFloorAt(int x, int y) {
		world.setPlace(x, y, new FloorPlace());
	}
	
	public void createWallAt(int x, int y) {
		world.setPlace(x, y, new WallPlace());
	}
	
	public void createEmptyWorld() {
		for(int y = 0; y < world.getHeight(); y++) {
			for(int x = 0; x < world.getWidth(); x++) {
				createFloorAt(x, y);				
			}						
		}
	}
	
	public void createRandomWorld(int emptynessRatio) {
		for(int y = 0; y < world.getHeight(); y++) {
			for(int x = 0; x < world.getWidth(); x++) {
				if(Math.round(Math.random() * 100) < emptynessRatio){
					createFloorAt(x, y);
				} else {
					createWallAt(x, y);
				}
			}						
		}
	}
	
}


// TestApp.java

package patterns.builder;

import patterns.builder.map.World;
import patterns.builder.map.WorldBuilder;


public class TestApp {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		World world = new World(20, 5);
		WorldBuilder builder = new WorldBuilder(world);
		builder.createEmptyWorld();		
                      world.render();		
		builder.createRandomWorld(90);
		world.render();		
	}
	
}

А вот результат работы:

....................
....................
....................
....................
....................

...##......#........
.#..................
.......#.......#....
.......#..#.....#...
..##....#.....#.....

Comments

comments


Bookmark and Share