Шаблон AbstractFactory Java

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

Предложенное решение изолирует конкретные классы. Так как абстрактная фабрика реализует процесс создания классов-фабрик и саму процедуру ини­циа­лизации объектов, то она изолирует приложение от деталей реализации классов.

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

/*пример # 11 : создание классов-фабрик по заданному признаку :

AbstractFactory.java */

package chapt05.abstractfactory;

public class AbstractFactory {

enum Color { BLACK, WHITE };

public static BaseFactory getFactory(String data) { Color my = Color.valueOf(data.toUpperCase());

switch (my){

case BLACK : return new BlackFactory();

case WHITE : return new WhiteFactory();

default : throw new

EnumConstantNotPresentException(Signs.class, sign.name());

}

}

}

clip_image002

Рис. 5.7. Пример реализации шаблона AbstractFactory

Производители объектов реализуют методы по созданию не связанных иерархическими зависимостями объектов. Класс BaseFactory – абстрактная фабрика, а классы BlackFactory и WhiteFactory конкретные производители объектов, наследуемые от нее. Конкретные фабрики могут создавать черные или белые объекты-продукты.

/*пример # 12 : классы-фабрики по созданию несвязанных объектов :

BaseFactory.java : BlackFactory.java : WhiteFactory.java */

package chapt05.abstractfactory;

public abstract class BaseFactory {

public abstract Circle createCircle(double radius);

public abstract Triangle createTriangle(double a,

double b);

}

package chapt05.abstractfactory;

public class BlackFactory extends BaseFactory {

public Circle createCircle(double radius) {

return new BlackCircle(radius);

}

public Triangle createTriangle(double a, double b){

return new BlackTriangle(a,b);

}

}

package chapt05.abstractfactory;

public class WhiteFactory extends BaseFactory {

public Circle createCircle(double radius) {

return new WhiteCircle(radius);

}

public Triangle createTriangle(double a, double b){

return new WhiteTriangle(a, b);

}

}

Рассматриваются два вида классов-продуктов: Circle, Triangle. Каждый из них может быть представлен в одном из двух цветов: белом или
черном.

/*пример # 13 : классы-продукты : Circle.java : Triangle.java */

package chapt05.abstractfactory;

public abstract class Circle {

protected double radius;

protected String color;

public abstract void square();

}

package chapt05.abstractfactory;

public class BlackCircle extends Circle {

public BlackCircle(double radius){

this.radius = radius;

color = "Black";

}

public void square(){

double s = Math.PI * Math.pow(radius, 2);

System.out.println(color + " Circle"

+ " Square = " + s);

}

}

package chapt05.abstractfactory;

public class WhiteCircle extends Circle{

public WhiteCircle(double radius){

this.radius = radius;

color = "White";

}

public void square(){

double s = Math.PI * Math.pow(radius, 2);

System.out.println(color + " Circle "

+ "Square = " + s);

}

}

package chapt05.abstractfactory;

public abstract class Triangle {

protected double a, b;

protected String color;

public abstract void square();

}

package chapt05.abstractfactory;

public class BlackTriangle extends Triangle {

public BlackTriangle (double a, double b){

this.a = a;

this.b = b;

color = "Black";

}

public void square(){

double s = a * b / 2;

System.out.println(color + " Triangle"

+ " Square = " + s);

}

}

package chapt05.abstractfactory;

public class WhiteTriangle extends Triangle {

public WhiteTriangle (double a,double b) {

this.a = a;

this.b = b;

color = "White";

}

public void square(){

double s = 0.5 * a * b;

System.out.println(color + " Triangle"

+ " Square = " + s);

}

}

Ниже будут созданы объекты всех классов и всех цветов.

/*пример # 14 : демонстрация работы шаблона AbstractFactory : Main.java */

package chapt05.abstractfactory;

public class Main {

public static void main(String[] args) {

BaseFactory factory1 =

AbstractFactory.getFactory("black");

BaseFactory factory2 =

AbstractFactory.getFactory("white");

Circle ob1 = factory1.createCircle(1.232);

Circle ob2 = factory2.createCircle(1);

Triangle ob3 = factory1.createTriangle(12,5);

Triangle ob4 = factory2.createTriangle(1,7);

ob1.square();

ob2.square();

ob3.square();

ob4.square();

}

}

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100