Boş bir kurucusu olan Simple class'ı için Factory class'ı aşağıdaki gibidir :
public class SimpleFactory { public Simple createSimple(){ return new Simple(); } }
Bu factory class'ının kullanılışı aşağıdaki gibidir :
public class Test { public static void main(String[] args) { SimpleFactory factory=new SimpleFactory(); Simple simple=factory.createSimple(); } }
Görüldüğü gibi Simple nesnesi Factory class'ı ile üretilmiştir.
Aşağıdaki örnek verilen parametre değerine göre farklı class'lardan nesne yaratılıp döndürülmektedir.
public interface Logger {}
public class TestLogger implements Logger {}
public class ProductionLogger implements Logger{}
Uygulamada TestLogger mı ProductionLogger mı kullanılacağına karar vermek için LoggerFactory class'ı kullanılır :
public class LoggerFactory { public Logger createLogger(){ // stage bilgisi konfigurasyon dosyalarından bulunur String stage="PRODUCTION"; // veya "TEST" olur.. if(stage.equals("PRODUCTION")){ return new ProductionLogger(); }else if(stage.equals("TEST")){ return new TestLogger(); }else{ throw new RuntimeException("Logger bulunamadı"); } } }
Kullanımı aşağıdaki gibidir :
public class Test { public static void main(String[] args) { LoggerFactory factory=new LoggerFactory(); Logger logger=factory.createLogger(); } }
Factory tasarımına uygun bir sınıf yapmak için bir Factory sınıfı olmalı ve bu sınıfta createXXX şeklinde bir method bulunmalıdır. createXXX.. methodu bir interface , abstract class veya class döndürebilir. create methodu aldığı parametre değerlerine göre veya çalışma anındaki konfigurasyon veya anlık durum bilgilerine göre (örneğin zaman , sistem bilgisi vs.) farklı class'lardan bir tercih yapmalı ve bulduğu class'ın nesnesini yaratıp döndürmelidir. Bu şekilde Factory class'ını kullanan nesnelerin nasıl yaratılacağı ve hangi class'tan yaratılacağı ile ilgilenmez. Aşağıda bir factory class genel yapısı bulunmaktadır.
public class Factory { public A create****() { // burada parametre girilebilir de. if (kosul1) { // koşul uyuyor ise return new X(); } else if (kosul2) { // koşul uyyor ise return new Y(); } else if (kosul3) { // koşul uyyor ise return new Z(); } else { // hiç bir koşula uymuyor ise return new T(); } } }
Burada eğer A class'ı bir interface ise X , Y , Z , T class'ları bu interface'si implements etmiştir. Eğer abstract class veya class ise X , Y , Z , T class'ları A class'ını extend etmiş olması gerekmektedir.