الگوی سازنده

الگوی سازنده یک الگوی مهندسی نرم‌افزار به منظور ایجاد اشیا میباشد. این الگو بر خلاف الگوی کارخانه انتزاعی ( abstract factory pattern ) و الگوی روش کارخانه ( factory method pattern ) که به منظور رعایت پدیده چندریختی ( polymorphism ) ایجاد شده‌اند به منظور حل وجه دیگری از مشکل ساخت و تنظیم اشیا در برنامه نویسی معرفی شده است.
مشکل بدین شرح است که گاهی نیاز است هنگام ساخت یک شی تعداد زیادی پارامتر را به سازنده ( constructor ) آن تحویل دهیم و این کار برنامه نویسی و همچنین خوانایی برنامه را کم می‌کند . به منظور حل این مشکل از الگوی سازنده استفاده می‌کنیم. در این تکنیک به جای طراحی تعدادی سازنده ( constructor ) با تعداد زیادی پارامتر از یک شی دیگر استفاده می‌کنیم که کار پارامتر دهی را به صورت مرحله به مرحله و خوانا‌تر انجام می‌دهد و در نهایت از نوع شی مورد نظر یک نمونه با تنظیمات خواسته شده را به ما تحویل می‌دهد.
معمولا یک طراح در سیر طراحی، ابتدا با الگوی روش کارخانه ( factory method ) شروع میکند سپس به الگوی کارخانه انتزاعی ( abstract factory ) یا الگوی نمونه‌ی اولیه ( prototype ) یا سازنده ( builder ) متوسل می‌شود . معمولا هنگامی به الگوی سازنده متوسل می‌شویم که در فرایند طراحی به انعطاف پذیری بیشتر نیاز پیدا می‌کنیم.
تعریف
نیت استفاده از این الگو این است که فرایند ساخت ( construction ) یک شی پیچیده را از کد آن شی ( object representation ) جدا کنیم.
ساختار
Builder Structure
سازنده ( buillder )
یک رابط انتزاعی برای ساخت شی
سازنده‌ی پیاده سازی شده و واقعی ( concrete 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 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();