**الگوی سازنده** یک الگوی مهندسی نرم‌افزار به منظور ایجاد اشیا میباشد. این الگو برخلاف الگوی کارخانه انتزاعی ( abstract factory pattern ) و الگوی روش کارخانه ( factory method pattern ) که به منظور رعایت پدیدۀ چندریختی ( polymorphism ) ایجاد شده‌اند به منظور حل وجۀ دیگری از مشکل ساخت و تنظیم اشیا در برنامه‌نویسی معرفی شده‌است.
مشکل بدین شرح است که گاهی نیاز است هنگام ساخت یک شی تعداد زیادی پارامتر را به سازندۀ ( constructor ) آن تحویل دهیم و این کار خوانایی برنامه را کم می‌کند. به منظور حل این مشکل از الگوی سازنده استفاده می‌کنیم. در این الگو به جای طراحی تعدادی سازنده ( constructor ) با تعداد زیادی پارامتر ، از یک شی دیگر استفاده می‌کنیم که کار پارامتر دهی را به صورت مرحله به مرحله و خوانا تر انجام می‌دهد و در نهایت از نوع شی مورد نظر یک نمونه با تنظیمات خواسته شده به ما تحویل می‌دهد.

معمولاً یک طراح در سیر طراحی٬ ابتدا با الگوی روش کارخانه ( factory method ) شروع می‌کند سپس به الگوی کارخانه انتزاعی ( abstract factory ) یا الگوی نمونهٔ اولیه ( prototype ) یا سازنده ( builder ) متوسل می‌شود. معمولاً هنگامی به الگوی سازنده متوسل می‌شویم که در فرایند طراحی به انعطاف‌پذیری بیشتر نیاز پیدا می‌کنیم.

تعریف
-----

نیت استفاده از این الگو این است که فرایند ساخت ( construction ) یک شی پیچیده را از کد آن شی ( object representation ) جدا کنیم.

ساختار
------

Builder StructureBuilder 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();
 }
}

```