Monday, August 15, 2011

Шаблоны проектирования - Factory

Привет, в продолжение темы о шаблонах проектирования.

На этот раз обсудим распространенный шаблон Factory. Дальше посмотрим, что у меня вышло.

Factory
Часто выходит такая ситуация, что относительно входного аргумента требуется создавать различные объекты, но которые имеют общий интерфейс, соответственно схожий по сигнатуре набор методов класса. Как это реализовать видно далее по коду. Если посмотреть на структуру в общем, то требуется описать интерфейс, который будут имплементировать каждый из классов, экземпляры которых требуется создавать. Далее сами классы, имплиметирующие данный интерфейс, и статический класс Factory, который будет знать валидные значения входного аргумента и в соответствии со значением, создавать необходимый экземпляр класса.
package com.vlad.pattern.factory;

public interface UFOInterface {
	
	public int getBrains();
	public int getHands();
}
package com.vlad.pattern.factory;

public class UFO104 implements UFOInterface {

	@Override
	public int getBrains() {
		return 9;
	}

	@Override
	public int getHands() {
		return 6;
	}
}
package com.vlad.pattern.factory;

public class UFO452 implements UFOInterface {

	@Override
	public int getBrains() {
		return 6;
	}

	@Override
	public int getHands() {
		return 2;
	}
}
package com.vlad.pattern.factory;

public class UFOFactory {
	
	public static final int UFO104 = 104;
	public static final int UFO452 = 452;
	
	public static UFOInterface createUFO(int number) {
		switch (number) {
		case UFO104:
			return new UFO104();
			
		case UFO452:
			return new UFO452();
			
		default:
			throw new IllegalArgumentException(String.format("Unknown UFO number: %d", number));
		}
	}
}
package com.vlad.pattern.factory;

import static org.junit.Assert.*;

import org.junit.Test;

public class UFOFactoryTest {

	@Test
	public void test() {
		UFOInterface ufo104 = UFOFactory.createUFO(UFOFactory.UFO104);
		UFOInterface ufo452 = UFOFactory.createUFO(UFOFactory.UFO452);

		assertEquals(ufo104.getBrains(), 9);
		assertEquals(ufo104.getHands(), 6);
		
		assertEquals(ufo452.getBrains(), 6);
		assertEquals(ufo452.getHands(), 2);
	}
}
Вот и все, все очень просто на самом деле. Удачи.

No comments:

Post a Comment