2016-04-03 25 views
1

Şu anda bir kütüphanede çalışıyorum ve kodların parçalarını olabildiğince fazla kullanabilmeyi denedim. Bununla birlikte, bazı alanları temiz bir şekilde geri döndürmenin başka bir yolunu göremediğim için, bazı alanların somutlaştırılması gerekiyor.Özel Fabrika Uygulamalarına izin vermek için bir Fabrikanın ayrıştırılması

public IKey GenerateKey() { 
    return new Key(param1, param2, param3); 
} 
Buna Çözümümün anda dönen konkresyonları için statik yöntemlerle bir fabrika sınıfı oluşturmaktır

:

public IKey GenerateKey() { 
    return KeyFactory.Get(param1, param2, param3); 
} 

Ama şimdi hissediyorum Örneğin, kod bir alan kilit bir nesneyi döndürmek gerekiyor Fabrika ve kod tabanı arasında yüksek bağlantı varmış gibi, birçok parçada fabrikadan nesne talep eden birkaç satır var. Aynı zamanda, sadece birçok durumda somut bir sınıf vermek için bazı fabrika işlevlerini kırbaçlayabildiğim için tembelleşiyor.

Benim en büyük problemim, insanların mevcut arabirimleri uygulayarak kendi sınıflarını oluşturarak sınıfların yerini almasına izin vermektir. Kullanıcıların kendi OWN fabrikalarını kendi OWN sınıf uygulamaları için oluşturmasına izin vermeliyim. Eğer benim fabrika için bir arayüz oluşturursam ve kullanıcıların arayüzü kendi fabrikalarını oluşturmaları için izin verdiysem, o zaman bu fabrikayı oluşturmak için daha yüksek bir fabrikaya ihtiyacım var, ve bu yüzden ...

Kullanıcılara ihtiyacım var Doğru arayüzleri uygulayarak kendi özel sınıflarını oluşturmak için, kendi sınıflarını ihtiyaç duyulan yerlerde kodun diğer alanlarına geri gönderebilecek kendi fabrikalarını oluşturmak ve hepsi birlikte sorunsuz bir şekilde çalışmak.

Düzeltme: Şu anda sahip olduğum bu fikir, ancak fabrikada yapılan bir uygulama, Java'da bir kitaplık kullanıldığında alışılmadık bir şey gibi görünüyor.

public class Key implements IKey { 
    public Key(param1) { 
     //do something 
    } 
    //other methods 
} 

public interface IKey{ 
    //Other methods 
} 

public class RicksFactory { 
    public IKey getKey(param1) { 
     return new Key(param1); 
    } 
} 

public interface IFactory { 
    IKey getKey(param1); 
} 

//This class is a singleton, for other classes in 
//library to find it without having to do dependency 
//injection down all the levels of classes. 
public class TopClassInLibrary { 
    //Singleton init 

    public void SetFactory(IFactory factory) { 
     this.factory = factory; 
    } 

    public IFactory GetFactory() { 
     return new RicksFactory(); 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     TopClassInLibrary.GetInstance().SetFactory(new RicksFactory()); 

    } 
} 

** Düzenleme 2: onun iyi olmadığını ya da değil birisi bana söyler misiniz ** Ben şimdi güzel bir çözüm olduğunu çözdüm, bunu takdir ediyorum? Bu kurulum Yani

public class Key implements IKey { 
    public Key(param1) { 
     //do something 
    } 
    //other methods 
} 

public interface IKey{ 
    //Other methods 
} 

public class RicksFactory { 
    public IKey getKey(param1) { 
     return new Key(param1); 
    } 
} 

public interface IFactory { 
    IKey getKey(param1); 
} 

public class TopClassInLibrary { 
    private static TopClassInLibrary topClass; 
    private static TopClassInLibrary GetInstance() { 
     if(topClass == null) 
      topClass = new TopClassInLibrary(); 
     return topClass; 
    } 

    private IFactory factory; 

    public void SetFactory(IFactory factory) { 
     this.factory = factory; 
    } 

    public IFactory GetFactory() { 
     if(factory == null) 
      factory = new RicksFactory(); 
     return factory; 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     //Below not needed now for default implementation 
     //TopClassInLibrary.GetInstance().SetFactory(new RicksFactory()); 
     IKey myKey = TopClassInLibrary.GetFactory().getKey(param1); 
    } 
} 

Teşekkür

, TopClassInLibrary istenen kendi örneğini oluşturur gibi destekleniyor veya kitaplığı kullanarak dış kod tarafından dokunulmaya ihtiyacı ve özel bir tek ayarlanmamış varsayılan fabrika oluşturur asla .

+0

Neden fabrikada geleneksel olmayan bir enjekte ediliyor? Spring Framework ile böyle bir şey yapılabilir. OSGI/Eclipse kullanarak, benzer bir kavram olan bir fabrikanın kullanılmasına izin vermek için katkıda bulunanları bir uzatma noktasına kullanırız. – KevinO

+0

Belki de yeteri kadar kütüphaneye maruz kalmamışımdır, sadece deneyimlerimde bir kütüphane kullanmaya başlamak için yerleşik bir fabrikayı asla enjekte etmem gerekti. – Tom

cevap