الگوی سازنده یک الگوی مهندسی نرمافزار به منظور ایجاد اشیا میباشد. این الگو برخلاف الگوی کارخانه انتزاعی ( abstract factory pattern ) و الگوی روش کارخانه ( factory method pattern ) که به منظور رعایت پدیدۀ چندریختی ( polymorphism ) ایجاد شدهاند به منظور حل وجۀ دیگری از مشکل ساخت و تنظیم اشیا در برنامهنویسی معرفی شدهاست. مشکل بدین شرح است که گاهی نیاز است هنگام ساخت یک شی تعداد زیادی پارامتر را به سازندۀ ( constructor ) آن تحویل دهیم و این کار خوانایی برنامه را کم میکند . به منظور حل این مشکل از الگوی سازنده استفاده میکنیم. در این الگو به جای طراحی تعدادی سازنده ( constructor ) با تعداد زیادی پارامتر ، از یک شی دیگر استفاده میکنیم که کار پارامتر دهی را به صورت مرحله به مرحله و خوانا تر انجام میدهد و در نهایت از نوع شی مورد نظر یک نمونه با تنظیمات خواسته شده به ما تحویل میدهد.
معمولاً یک طراح در سیر طراحی٬ ابتدا با الگوی روش کارخانه ( factory method ) شروع میکند سپس به الگوی کارخانه انتزاعی ( abstract factory ) یا الگوی نمونهٔ اولیه ( prototype ) یا سازنده ( builder ) متوسل میشود . معمولاً هنگامی به الگوی سازنده متوسل میشویم که در فرایند طراحی به انعطافپذیری بیشتر نیاز پیدا میکنیم.
نیت استفاده از این الگو این است که فرایند ساخت ( construction ) یک شی پیچیده را از کد آن شی ( object representation ) جدا کنیم.
public class StreetMap {
private final Point origin;
private final Point destination;
private final Color waterColor;
private final Color landColor;
private final Color highTrafficColor;
private final Color mediumTrafficColor;
private final Color lowTrafficColor;
public StreetMap(Point origin, Point destination, Color waterColor, Color landColor, Color highTrafficColor, Color mediumTrafficColor, Color lowTrafficColor) {
// Required parameters
this.origin = origin;
this.destination = destination;
// Optional parameters
this.waterColor = waterColor;
this.landColor = landColor;
this.highTrafficColor = highTrafficColor;
this.mediumTrafficColor = mediumTrafficColor;
this.lowTrafficColor = lowTrafficColor;
}
public static void main(String args[]) {
StreetMap map = new StreetMap(new Point(50, 50), new Point(100, 100), Color.BLUE, Color.GRAY, Color.RED, Color.YELLOW, Color.GREEN);
}
}
قابل مشاهده است که در این روش میتوان به بعضی از پارامترها مقدار اولیه نداد. در این صورت در کلاس Builder برای متغیرها مقدار پیش فرض تعیین میکند.
public class StreetMap {
private final Point origin;
private final Point destination;
private final Color waterColor;
private final Color landColor;
private final Color highTrafficColor;
private final Color mediumTrafficColor;
private final Color lowTrafficColor;
public static class Builder {
// Required parameters
private final Point origin;
private final Point destination;
// Optional parameters - initialize with default values
private Color waterColor = Color.BLUE;
private Color landColor = new Color(30, 30, 30);
private Color highTrafficColor = Color.RED;
private Color mediumTrafficColor = Color.YELLOW;
private Color lowTrafficColor = Color.GREEN;
public Builder(Point origin, Point destination) {
this.origin = origin;
this.destination = destination;
}
public Builder waterColor(Color color) {
waterColor = color;
return this;
}
public Builder landColor(Color color) {
landColor = color;
return this;
}
public Builder highTrafficColor(Color color) {
highTrafficColor = color;
return this;
}
public Builder mediumTrafficColor(Color color) {
mediumTrafficColor = color;
return this;
}
public Builder lowTrafficColor(Color color) {
lowTrafficColor = color;
return this;
}
public StreetMap build() {
return new StreetMap(this);
}
}
private StreetMap(Builder builder) {
// Required parameters
origin = builder.origin;
destination = builder.destination;
// Optional parameters
waterColor = builder.waterColor;
landColor = builder.landColor;
highTrafficColor = builder.highTrafficColor;
mediumTrafficColor = builder.mediumTrafficColor;
lowTrafficColor = builder.lowTrafficColor;
}
public static void main(String args[]) {
StreetMap map = new StreetMap.Builder(new Point(50, 50), new Point(100,
100)).landColor(Color.GRAY).waterColor(Color.BLUE.brighter())
.build();
}
}