2 entry daha
  • yaratımsal (creational) bir tasarım deseni (design pattern).

    bir sınıf ailesinin (product1, product2, product3) oluşturulması için ortak bir arayüz (abstractfactory) belirlersiniz. daha sonra, bu sınıf ailesinin farklı alt sınıflardaki örneklerinin (product1a, product1b, product1c, product2a, product2b, product2c) yaratılmasını da abstractfactory arayüzünü geliştiren birer sınıf (factorya, factoryb, factoryc) üzerinden gerçekleştirirsiniz.

    bu farklı üretici sınıflar, aslında sadece kendileriyle ilişkili ürünleri üretirler ama hepsi 'abstractfactory'den türediği için, bu sınıfları kullanan istemci sınıflar tek bir arayüzü ve dolayısıyla tek bir kodu kullanarak her tür ürün ailesiyle çalışabilirler.

    örneğin bir veritabanı sistemini ele alalım: ortak sınıflar veritabanı(database) ve tablo(table), her veritabanı türü için (microsoft, oracle, mysql) ortaktır. dolayısıyla bunların davranışlarını birer üst sınıfta belirtebiliriz:

    abstract class database {}
    abstract class table {}

    daha sonra bu soyut(abstract) sınıfların yaratılmasını gerçekleştiren bir soyut fabrika (abstractfactory) sınıfı yazalım:

    abstract class dbmsmanager
    {
    public abstract database createdatabase();
    public abstract table createtable();
    }

    yapıyı soyut olarak tanımladıktan sonra, soyut ürünlerin her birinin farklı aileleri için farklı sınıfları tanımlayalım:

    class mysql_database : database {}
    class oracle_database : database {}
    class microsoft_database : database {}

    class mysql_table : table {}
    class oracle_table : table {}
    class microsoft_table : table {}

    ve her bir ürün ailesi için soyut fabrikadan kalıtlanan birer ayrık fabrika sınıfı yazalım:

    class mysql_dbmsmanager : dbmsmanager {}
    class oracle_dbmasmanager : dbmasmanager {}
    class microsoft_dbmsmanager : dbmsmanager {}

    örneğin mysql_dbmsmanager'ın createdatabase fonksiyonu, bir mysql_database nesnesi oluşturur ancak bu nesne database soyut sınıfından türediği için createdatabase fonksiyonunun sonucunda döndürülebilir. böylece mysql, oracle, microsoft veritabanlarının hepsini yönetmek için tanımladığımız tek bir arayüzden hepsini yönetebilecek ortak bir kod yazabiliriz:

    dbmsmanager mng = new mysql_dbmsmanager();
    database mydb = mng.createdatabase();

    sonuçta dönen veritabanı türünün hangi firmaya ait olduğu önemli değildir. böylece kodunuzun tekrar kullanılabilirliği ve genişletilebilirliği bir hayli yükselmiş olur.
4 entry daha
hesabın var mı? giriş yap