الگوی سازنده

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به ناوبری پرش به جستجو

الگوی سازنده یک الگوی مهندسی نرم‌افزار به منظور ایجاد اشیا میباشد. این الگو بر خلاف الگوی کارخانه انتزاعی ( 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();
	}
}