Yeni bir mimari konusu ile karşınızdayım değerli Java dostları. Bugünkü konumuz olan abstract factory design pattern – bundan sonra AF olarak yazacağım – factory kalıbının bir üst versiyonu. Diğer factory yazılarımdan hatırlarsak, obje oluşturmada kullanıyorduk. AF ise factory oluşturmada kullanılıyor. Bu kalıbın en iyi örneklerini UI ve grafik kütüphaneleri üzerinde görebiliriz. Her zaman ki gibi interface ve abstract yapıları üzerinden gitmek daha doğru olacaktır. İsterseniz hemen bir örnek ile başlayalım. Öncelikle hobi amaçlı 😀 enum sınıflarını yazalım.

package designpattern.abstractfactory;public enum PortWriterEnum {SerialPortWriter, ParallelPortWriter;}
package designpattern.abstractfactory;public enum FileWriterEnum {PdfWriter, NotepadWriter;}
package designpattern.abstractfactory;public enum AbstractWriterEnum {FileWriter, PortWriter;}

Şimdi de factory sınıflarını ve onların üreteceği sınıfları inceleyelim.

 

package designpattern.abstractfactory;public interface IFileWriter {public void writeToFile(String data);}
package designpattern.abstractfactory;public interface IPortWriter {public void sendData(String data);}
package designpattern.abstractfactory;public class PdfWriter implements IFileWriter {@Override
public void writeToFile(String data) {
System.out.println(“Data sent to Pdf: ” + data);
}}
package designpattern.abstractfactory;public class NotepadWriter implements IFileWriter {@Override
public void writeToFile(String data) {
System.out.println(“Data sent to notepad: ” + data);
}}
package designpattern.abstractfactory;public class SerialPortWriter implements IPortWriter {@Override
public void sendData(String data) {
System.out.println(“Data sent to serial port: ” + data);
}}
package designpattern.abstractfactory;public class ParallelPortWriter implements IPortWriter {@Override
public void sendData(String data) {
System.out.println(“Data sent to parallel port: ” + data);
}}
package designpattern.abstractfactory;public class FileWriterFactory implements IAbstractWriter {@Override
public IFileWriter getFileWriter(FileWriterEnum type) {
switch (type) {
case PdfWriter:
return new PdfWriter();
case NotepadWriter:
return new NotepadWriter();
}
return null;
}@Override
public IPortWriter getPortWriter(PortWriterEnum type) {
return null;
}}
package designpattern.abstractfactory;public class PortWriterFactory implements IAbstractWriter {@Override
public IPortWriter getPortWriter(PortWriterEnum type) {
switch (type) {
case SerialPortWriter:
return new SerialPortWriter();
case ParallelPortWriter:
return new ParallelPortWriter();
}
return null;
}@Override
public IFileWriter getFileWriter(FileWriterEnum type) {
return null;
}}
package designpattern.abstractfactory;public interface IAbstractWriter {public IFileWriter getFileWriter(FileWriterEnum type);public IPortWriter getPortWriter(PortWriterEnum type);}
package designpattern.abstractfactory;public class AbstractFactory {private static AbstractFactory instance = null;
private static Object lock = new Object();private AbstractFactory() {
}public static AbstractFactory getInstance() {
if (instance == null) {
synchronized (lock) {
if (instance == null)
instance = new AbstractFactory();
}
}
return instance;
}

public IAbstractWriter getAbstractWriter(AbstractWriterEnum type) {
switch (type) {
case FileWriter:
return new FileWriterFactory();
case PortWriter:
return new PortWriterFactory();
}
return null;
}

}

package designpattern.abstractfactory;public class AbstractFactoryMain {public static void main(String[] args) {AbstractFactory abstractFactory = AbstractFactory.getInstance();IAbstractWriter fileFactory = abstractFactory.getAbstractWriter(AbstractWriterEnum.FileWriter);
IAbstractWriter portFactory = abstractFactory.getAbstractWriter(AbstractWriterEnum.PortWriter);

IFileWriter pdfWriter = fileFactory.getFileWriter(FileWriterEnum.PdfWriter);
IFileWriter notepadWriter = fileFactory.getFileWriter(FileWriterEnum.NotepadWriter);

IPortWriter serialWriter = portFactory.getPortWriter(PortWriterEnum.SerialPortWriter);
IPortWriter parallelWriter = portFactory.getPortWriter(PortWriterEnum.ParallelPortWriter);

pdfWriter.writeToFile(“Pdf data”);
notepadWriter.writeToFile(“Notepad data”);

serialWriter.sendData(“Serial port data”);
parallelWriter.sendData(“Parallel port data”);

}

}

Biraz uzun ve karışık bir örnek gibi görünebilir; ama aslında belli bir noktaya kadar olan adımı factory design pattern üzerinden düşünebiliriz. Daha sonra yine bir interface aracılığı ile bu factory örneklerinden birisini alıyoruz. Bir nevi super-factory durumu oluşturduk.

Bol Java’ lı günler dileğiyle… 😀

No responses yet

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.