www.fatihkabakci.com

Personal Website and Computer Science TUR EN

BUILDER DESIGN PATTERN

Last update: 10/7/2014 10:34:00 PM

Yazan:Fatih KABAKCI

Creational(Yaradılış) paternlerinden biri olan Builder tasarım deseni, birden fazla nesnenin bir araya gelmesinden oluşan, kompleks yapıdaki sınıfların tasarımında kullanılan bir modeldir. Builder temelinde abstract bir Builder sınıfı kullanır ve üreteceği nesneleri bu sınıf içerisinde tanımladığı metot üzerinden üretir. Konuyu örnek bir senaryo üzerinden inceleyelim.

Örnek olarak hayali bir Fast Food firmasının müşterilerine sattığı ürünleri modelleyen bir yapımız olsun. Müşteriler farklı besinleri ihtiyaçlarına göre talep eder ve sipariş edebilir. Sipariş; yiyecek, içecek, tatlı ve salata ürünü olmak üzere 4 adet farklı modelden oluştuğunu düşünelim. Örneğin firmaya gelen bir müşteri, yiyecek olarak hamburger, içecek olarak kola, tatlı olarak donut ve salata olarak da Cesar Salata istesin. Bu durumda müşteri bir menu sipariş edecektir ve siparişi yukarıdaki 4 nesneden oluşacaktır.

Yukarıdaki model bir siparişin 4 farklı nesneden olduğunu gösterir. Bunun anlamı yazılacak Sipariş sınıfının, aslında 4 farklı sınıfın nesnelerini içereceğini gösterir. O halde bir Order(Sipariş) sınıfı, bir Food(Yiyecek), bir Drink(İçecek), bir Dessert(Tatlı) ve bir Salad(Salata) nesnesinden oluşacağı açıktır.

Builder Tasarım Deseni kompleks bir nesneyi oluşturmak amacıyla abstract bir Builder sınıfı yaratır ve bu sınıfı soyut olarak extend eden somut alt sınıf ise istenilen nesne özelliklerine göre(propetries) create edilip kullanılır.

Yukarıdaki örnek senaryonun UML diyagramı aşağıda verilmektedir.

Yukarıdaki UML diyagramına göre Food,Drink,Dessert ve Salad adında oluşturulan 4 farklı parça sınıfın, Order sınıfı içinde tanımlandığı görülmektedir. Ayrıca Builder tasarım deseni için oluşturulan OrderBuilder soyut sınıfı ise, içerisinde bir Order ürettiği görülmektedir. Kullanıcı sınıf olan, yani main() metodunu bulunduran Waiter sınıfı ise, istenilen siparişe göre uygun olan JuniorMenuBuilder nesnesini üreterek bir sipariş gerçekleştirmektedir.

Tüm bu anlatılanları fiziksel olarak Java Programlama Dilinde tanımlanırsa aşağıdaki sınıflar ortaya çıkacaktır.

Food Sınıfı

package Builder.Menu;

/**
 * 
 * @author www.fatihkabakci.com
 * @summary The class Food
 */
public class Food {

   private String food;
   
   public Food(String food) {
      this.setFood(food);
   }

   public String getFood() {
      return food;
   }

   public void setFood(String food) {
      this.food = food;
   }
}

Drink Sınıfı

package Builder.Menu;

/**
 * 
 * @author www.fatihkabakci.com
 * @summary The class Drink
 *
 */
public class Drink {

   private String drink;

   public Drink(String drink) {
      this.drink = drink;
   }
   public String getDrink() {
      return drink;
   }
   public void setDrink(String drink) {
      this.drink = drink;
   }
}

Dessert Sınıfı

package Builder.Menu;

/**
 * 
 * @author www.fatihkabakci.com
 * @summary The class Dessert
 *
 */
public class Dessert {

   private String desert;
   
   public Dessert(String desert) {
      this.setDesert(desert);
   }

   public String getDesert() {
      return desert;
   }

   public void setDesert(String desert) {
      this.desert = desert;
   }
}

Salad Sınıfı

package Builder.Menu;

/**
 * 
 * @author www.fatihkabakci.com
 * @summary The class Salad
 *
 */
public class Salad {

   private String salad;

   public Salad(String salad) {
      this.salad = salad;
   }
   public String getSalad() {
      return salad;
   }

   public void setSalad(String salad) {
      this.salad = salad;
   }
}
Hatırlanırsa, bir Order(Sipariş), bir Food(Yiyecek), bir Drink(İçecek), bir Dessert(Tatlı) ve bir Salad(Salata) 'dan oluşmakta idi. Yukarıdaki 4 nesneden oluşan Order sınıfı ise aşağıdaki gibidir.

Order Sınıfı

package Builder.Menu;


/**
 * @author www.fatihkabakci.com
 * @summary The class Order is composed from Food,Drink,Dessert and Salad.
 */
public class Order {

   private Food    food;
   private Drink   drink;
   private Dessert dessert;
   private Salad   salad;

   public Order() {

   }

   public Order(Food food, Drink drink, Dessert dessert, Salad salad) {
      this.food = food;
      this.drink = drink;
      this.dessert = dessert;
      this.salad = salad;
   }

   public Food getFood() {
      return food;
   }

   public void setFood(Food food) {
      this.food = food;
   }

   public Drink getDrink() {
      return drink;
   }

   public void setDrink(Drink drink) {
      this.drink = drink;
   }

   public Dessert getDessert() {
      return dessert;
   }

   public void setDessert(Dessert dessert) {
      this.dessert = dessert;
   }

   public Salad getSalad() {
      return salad;
   }

   public void setSalad(Salad salad) {
      this.salad = salad;
   }
}
Bu noktada Builder tasarım deseninin yeni başlandığı unutulmamalıdır. Yukarıda yazılan her bir sınıf, senaryo gereği hali hazırda var olan sınıflardır. Amaç bu standart üretim yapısının, Builder deseni üzerinde yoğurmaktır. Aşağıda Builder tasarım deseninin ilk hamlesi olan OrderBuilder adında soyut bir sınıf oluşumu gösterilmektedir. Bu Builder sınıfı, Order nesnelerinin setter metotlarını abstract olarak içerir.

OrderBuilder Sınıfı

package Builder.Build;

import Builder.Menu.Dessert;
import Builder.Menu.Drink;
import Builder.Menu.Food;
import Builder.Menu.Order;
import Builder.Menu.Salad;

/**
 * @author www.fatihkabakci.com
 * @summary The methods of setter of the class Order should be defined as abstract method in the abstract class OrderBuilder.
 */
public abstract class OrderBuilder {

   private Order order;

   public OrderBuilder() {

   }

   public Order getOrder() {
      if (order == null) {
         order = new Order();
      }
      return order;
   }

   public abstract void setFood(Food food);

   public abstract void setDrink(Drink drink);

   public abstract void setDessert(Dessert dessert);

   public abstract void setSalad(Salad salad);
}
OrderBuilder tasarım sınıfının getOrder() metodu ile bir Order nesnesi döndürdüğüne, ayrıca bu nesnenin setter() metotlarını içerdiğine de dikkat ediniz. Bu noktada OrderBuilder 'ı somut olarak uygulayan sınıfı aşağıda verilmektedir.

JuniorMenuBuilder Sınıfı

package Builder.Build;

import Builder.Menu.Dessert;
import Builder.Menu.Drink;
import Builder.Menu.Food;
import Builder.Menu.Salad;

/**
 * 
 * @author www.fatihkabakci.com
 * @summary The sub class JuniorMenuBuilder of the design class OrderBuilder
 *
 */
public class JuniorMenuBuilder extends OrderBuilder {

   @Override
   public void setFood(Food food) {
      getOrder().setFood(food);
   }

   @Override
   public void setDrink(Drink drink) {
      getOrder().setDrink(drink);
      
   }

   @Override
   public void setDessert(Dessert dessert) {
      getOrder().setDessert(dessert);
      
   }

   @Override
   public void setSalad(Salad salad) {
      getOrder().setSalad(salad);
      
   }
}
Yukarıdaki tüm sınıfları uygulayan main() sınıfı ise aşağıda verilmektedir.

Uygulama

Waiter Sınıfı

package Builder;

import Builder.Build.JuniorMenuBuilder;
import Builder.Build.OrderBuilder;
import Builder.Menu.Dessert;
import Builder.Menu.Drink;
import Builder.Menu.Food;
import Builder.Menu.Order;
import Builder.Menu.Salad;

/**
 * 
 * @author www.fatihkabakci.com
 * @summary The creation Order from OrderBuilder
 */
public class Waiter {

   private OrderBuilder builder;

   public Order makeOrder(Food food, Drink drink, Dessert dessert, Salad salad) {
      if (food.getFood().equals("Hamburger") && drink.getDrink().equals("Cola") && dessert.getDesert().equals("Ice Cream") && salad.getSalad()
                                                                                                                                   .equals("Cesar Salad")) {
         builder = new JuniorMenuBuilder();
      }

      builder.setFood(food);
      builder.setDrink(drink);
      builder.setDessert(dessert);
      builder.setSalad(salad);
      return builder.getOrder();
   }

   public static void main(String[] args) {

      Food food = new Food("Hamburger");
      Drink drink = new Drink("Cola");
      Dessert dessert = new Dessert("Ice Cream");
      Salad salad = new Salad("Cesar Salad");

      Waiter waiter = new Waiter();
      Order juniorMenu = waiter.makeOrder(food, drink, dessert, salad);

      System.out.println("Food:" + juniorMenu.getFood().getFood());
      System.out.println("Drink:" + juniorMenu.getDrink().getDrink());
      System.out.println("Dessert:" + juniorMenu.getDessert().getDesert());
      System.out.println("Salad:" + juniorMenu.getSalad().getSalad());
   }
}
Yukarıdaki main() içerisinde sırasıyla, Food,Drink,Dessert ve Salad nesneleri oluşturulmaktadır. Fast Food mağazasına gelen müşteri yiyecek olarak 'Hamburger', içecek olarak 'Kola', tatlı olarak 'Donut' ve salata olarak da 'Sezar Salata' istemektedir. Waiter waiter = new Waiter(); ifadesi ile 'masaya gelen garson' waiter.makeOrder(food, drink, dessert, salad); ifadesi ile siparişi gerçekleştirir. juniorMenu adında oluşan bu sipariş daha sonra 'adisyona yazılır'.

Builder tasarım deseni esasen 1, kullanım olarak ise 2-3 sınıftan oluşmaktadır. Karmaşık gibi görünse de basit bir düşüncesi bulunur. Gerçekten de yukarıdaki sınıfların eclipse ortamında paket hiyerarşisine bakıldığında bu açıkça görülmektedir.

Yukarıdaki senaryo gereğince birden fazla nesneden oluşan Sipariş sınıfı, Builder tasarım deseni tarafından gerçeklenmiştir. Builder tasarım deseni karmaşık nesnelerin oluşturulmasında, daha robust ve kullanımı kolaydır.Bunun yanında verbose(fazladan kodlardan oluşabilme) ve code duplication(tekrar kodlar) yaratan bir creational pattern olarak da bilinmektedir.

There has been no comment yet

Name:


Question/Comment
   Please verify the image




The Topics in Computer Science

Search this site for





 

Software & Algorithms

icon

In mathematics and computer science, an algorithm is a step-by-step procedure for calculations. Algorithms are used for calculation, data processing, and automated reasoning.

Programming Languages

icon

A programming language is a formal constructed language designed to communicate instructions to a machine, particularly a computer. It can be used to create programs to control the behavior of a machine. Java,C, C++,C#

Database

icon

A database is an organized collection of data. The data are typically organized to model aspects of reality in a way that supports processes requiring information.

Hardware

icon

Computer hardware is the collection of physical elements that constitutes a computer system. Computer hardware refers to the physical parts or components of a computer such as the monitor, memory, cpu.

Web Technologies

icon

Web development is a broad term for the work involved in developing a web site for the Internet or an intranet. Html,Css,JavaScript,ASP.Net,PHP are one of the most popular technologies. J2EE,Servlet, JSP,JSF, ASP

Mobile Technologies

icon

Mobile application development is the process by which application software is developed for low-power handheld devices, such as personal digital assistants, enterprise digital assistants or mobile phones. J2ME

Network

icon

A computer network or data network is a telecommunications network that allows computers to exchange data. In computer networks, networked computing devices pass data to each other along data connections.

Operating Systems

icon

An operating system is software that manages computer hardware and software resources and provides common services for computer programs. The OS is an essential component of the system software in a computer system. Linux,Windows

Computer Science

icon

Computer science is the scientific and practical approach to computation and its applications.A computer scientist specializes in the theory of computation and the design of computational systems.