Tasarım Deseni - Soyut Fabrika Modeli
Özet Fabrika kalıpları, diğer fabrikaları yaratan bir süper fabrika etrafında çalışır. Bu fabrika aynı zamanda fabrika fabrikası olarak da adlandırılır. Bu desen türü, bir nesneyi yaratmanın en iyi yollarından birini sağladığından, bu tür bir tasarım deseni yaratımsal modelin kapsamına girer.
Abstract Factory modelinde bir arayüz, sınıflarını açıkça belirtmeden ilgili nesnelerin bir fabrikasını oluşturmaktan sorumludur. Üretilen her fabrika, nesneleri Fabrika modeline göre verebilir.
Uygulama
Bir Shape arayüzü ve onu uygulayan somut bir sınıf oluşturacağız. Bir sonraki adım olarak AbstractFactory soyut fabrika sınıfı oluşturuyoruz. AbstractFactory'yi genişleten fabrika sınıfı ShapeFactory tanımlanmıştır. Bir fabrika yaratıcısı / üretici sınıfı FactoryProducer oluşturulur.
AbstractFactoryPatternDemo, demo sınıfımız bir AbstractFactory nesnesi almak için FactoryProducer'ı kullanır. İhtiyaç duyduğu nesne türünü elde etmek için AbstractFactory'ye bilgileri (ÇEMBER / DİKDÖRTGEN / KARE) geçirecektir.
Aşama 1
Şekiller için bir arayüz oluşturun.
Shape.java
public interface Shape {
void draw();
}
Adım 2
Aynı arayüzü uygulayan somut sınıflar oluşturun.
RoundedRectangle.java
public class RoundedRectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside RoundedRectangle::draw() method.");
}
}
RoundedSquare.java
public class RoundedSquare implements Shape {
@Override
public void draw() {
System.out.println("Inside RoundedSquare::draw() method.");
}
}
Rectangle.java
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
Aşama 3
Normal ve Yuvarlak Şekilli Nesneler için fabrikalar elde etmek üzere bir Soyut sınıf oluşturun.
AbstractFactory.java
public abstract class AbstractFactory {
abstract Shape getShape(String shapeType) ;
}
4. adım
AbstractFactory'yi verilen bilgilere göre somut sınıf nesnesi oluşturmak için genişleten Fabrika sınıfları oluşturun.
ShapeFactory.java
public class ShapeFactory extends AbstractFactory {
@Override
public Shape getShape(String shapeType){
if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
}else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
}
RoundedShapeFactory.java
public class RoundedShapeFactory extends AbstractFactory {
@Override
public Shape getShape(String shapeType){
if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new RoundedRectangle();
}else if(shapeType.equalsIgnoreCase("SQUARE")){
return new RoundedSquare();
}
return null;
}
}
Adım 5
Shape gibi bir bilgiyi ileterek fabrikaları elde etmek için bir Fabrika oluşturucu / üretici sınıfı oluşturun
FactoryProducer.java
public class FactoryProducer {
public static AbstractFactory getFactory(boolean rounded){
if(rounded){
return new RoundedShapeFactory();
}else{
return new ShapeFactory();
}
}
}
6. Adım
Type gibi bir bilgiyi ileterek somut sınıfların fabrikalarını elde etmek için AbstractFactory'yi almak için FactoryProducer'ı kullanın.
AbstractFactoryPatternDemo.java
public class AbstractFactoryPatternDemo {
public static void main(String[] args) {
//get shape factory
AbstractFactory shapeFactory = FactoryProducer.getFactory(false);
//get an object of Shape Rectangle
Shape shape1 = shapeFactory.getShape("RECTANGLE");
//call draw method of Shape Rectangle
shape1.draw();
//get an object of Shape Square
Shape shape2 = shapeFactory.getShape("SQUARE");
//call draw method of Shape Square
shape2.draw();
//get shape factory
AbstractFactory shapeFactory1 = FactoryProducer.getFactory(true);
//get an object of Shape Rectangle
Shape shape3 = shapeFactory1.getShape("RECTANGLE");
//call draw method of Shape Rectangle
shape3.draw();
//get an object of Shape Square
Shape shape4 = shapeFactory1.getShape("SQUARE");
//call draw method of Shape Square
shape4.draw();
}
}
7. Adım
Çıkışı doğrulayın.
Inside Rectangle::draw() method.
Inside Square::draw() method.
Inside RoundedRectangle::draw() method.
Inside RoundedSquare::draw() method.