Fabrika (Factory) Tasarım Deseni

04-05-2014
Nedir?

Fabrika tasarım deseni, creational tasarım desenlerinden biridir. Bu tasarım deseni JDK'da çok yaygın bir şekilde kullanılmaktadır. Ayrıca Spring ve Struts gibi framework'lerde de sıklıkla kullanılır.

Ne zaman Kullanılır?

Super sınıf ve alt sınıfların olduğu bir uygulamada, alt sınıfların yaratılma işlemini client yani istemci sınıfında yapılmasını engellemek için kullanılır

Nasıl Kullanılır?

Bir fabrika sınıfı oluşturup, alt sınıfların bu fabrika sınıfında yaratılması sağlanır.

Faydaları Nedir?

1. Kodlamayı implementasyona değil de interface'e yapmayı sağlar.
2. Client yani istemci tarafında nesne yaratılmasını önleyerek, alt sınıflarda yapılacak değişikliklerin istemci sınıfını etkilemesini önler. Bu sayede istemci sınıfı ile alt sınıflar birbirine daha az bağımlı hale gelmiş olur.
3. İmplementasyon ile client sınıfları arasında, kalıtım yoluyla soyutluk sağlar.

Gerekenler

Türü abstract, interface veya normal sınıf olan bir Super sınıf
En az bir tane alt sınıf
Bir tane factory sınıfı
Test sınıfı

Örnek Kullanım Alanları

1. java.util.Calendar, ResourceBundle ve NumberFormat sınıflarında bulunan getInstance() metodunda kullanılmaktadır.
2. Wrapper sınıflarda(Boolean, Integer, Double) bulunan valueOf() metodunda da kullanılmaktadır.


Örnek Uygulama


Super(Üst) Sınıfı:

/**
 * Super sinifimiz. Dikkat edin interface olarak tanimlandi. Normal sinif veya soyut ta olabilirdi
 */
public interface Shape {
    public double getArea();
    public double getSize();
}


Alt
Sınıflar:

/**
 * Basit bir Circle sinifi
 */
public class Circle implements Shape {
    private double radius;
    
    @Override
    public double getArea() {
        return Math.PI*radius*radius;
    }
    
    @Override
    public double getSize() {
        return 2*Math.PI*radius;
    }
    
    public void setRadius(double radius) {
        this.radius = radius;
    }
}

/**
 * Basit bir Rectangle sinifi
 */
public class Rectangle implements Shape {
    private double width;
    private double height;
    
    @Override
    public double getArea() {
        return width*height;
    }
    
    @Override
    public double getSize() {
        return 2*(width+height);
    }
    
    public void setWidth(double width) {
        this.width = width;
    }
    
    public void setHeight(double height) {
        this.height = height;
    }
}


Fabrika(Factory)
Sınıfı:

/**
 * Fabrika sinifimiz. Bu sinif goruldugu gibi nesne yaratmak icin kullaniliyor
 */
public class ShapeFactory {
    public static Shape getShape(String type){
        if("Rectangle".equalsIgnoreCase(type)){
            return new Rectangle();
        }else if("Circle".equalsIgnoreCase(type)){
            return new Circle();
        }else {
           throw new IllegalArgumentException();
        }
    }
}


İstemci(Client)
Sınıfı

/**
 * Test sinifi. Bu sinifta goruldugu gibi new ile yeni bir nesne yaratilmiyor. Bu sayede test sinifimizda
 * yazdigimiz bir sey degistirilmemis oluyor.
 */
public class TestFactory {
    public static void main(String[] args) {
        Shape rectangle = ShapeFactory.getShape("rectangle");
        ((Rectangle) rectangle).setWidth(13);
        ((Rectangle) rectangle).setHeight(5);
    
        Shape circle = ShapeFactory.getShape("circle");
        ((Circle) circle).setRadius(4);
    
        System.out.println("Rectangle area: "+rectangle.getArea()+" and size: "+rectangle.getSize());
        System.out.println("Circle area: "+circle.getArea()+" and size: "+circle.getSize());
    }
}

© 2019 Tüm Hakları Saklıdır. Codesenior.COM