Описание:
Паттерн Простая фабрика необходим для простой инкапсуляции процесса создания объектов от рабочего кода с помощью другого, отдельного класса. За простоту приходится платить минусом: мы привязываемся к определенной реализации и не можем обеспечить гибкость системы. Используйте этот паттерн только для себя и только в тех случаях, когда уверены, что изменения в архитектуру вноситься больше не будут.
Пример:
1 2 3 4 5 6 7 |
public class Main { public static void main(String[] args){ RoboticsInc roboticsInc = new RoboticsInc(); roboticsInc.makeRobot(0); roboticsInc.makeRobot(1); } } |
1 2 3 4 5 6 7 |
Robot name is R2D2 Boxing in Paper box Factory serial number: 28 Robot name is Galiaf Boxing in Paper box Factory serial number: 10 |
Коды классов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class RoboticsInc { public void makeRobot(int kind){ Robot robot = RobotFactory.createRobot(kind); generateSerialNumber(robot); boxing(robot); sendToClient(robot); } public void generateSerialNumber(Robot robot){ robot.setSerialNumber((int)(Math.random()*100)); } public void boxing(Robot robot){ robot.setBox("Paper box"); } public void sendToClient(Robot robot){ System.out.println("Robot name is "+robot.getName()); System.out.println("Boxing in "+robot.getBox()); System.out.println("Factory serial number: "+robot.getSerialNumber()); System.out.println(); } } |
1 2 3 4 5 6 7 8 9 |
public class RobotFactory { public static Robot createRobot(int kind){ switch (kind){ case 0: return new R2D2(); case 1: return new Galiaf(); default: return null; } } } |
1 2 3 4 5 6 7 |
public interface Robot { String getName(); void setBox(String box); String getBox(); void setSerialNumber(Integer sn); Integer getSerialNumber(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
public class R2D2 implements Robot { Integer sn; String box; @Override public String getName() { return "R2D2"; } @Override public void setBox(String box) { this.box = box; } @Override public String getBox() { return box; } @Override public void setSerialNumber(Integer sn) { this.sn = sn; } @Override public Integer getSerialNumber() { return sn; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
public class Galiaf implements Robot { String box; Integer sn; @Override public String getName() { return "Galiaf"; } @Override public void setBox(String box) { this.box = box; } @Override public String getBox() { return box; } @Override public void setSerialNumber(Integer sn) { this.sn = sn; } @Override public Integer getSerialNumber() { return sn; } } |
UML-диаграмма:
Паттерн Простая Фабрика