2011-09-21 18 views

cevap

6

verebilir Yani çok yararlı olacaktır, Soyut Fabrika desen niyet oluşturmak için bir arayüz sağlamak için Ortak sınıflarını belirtmeden ilgili veya bağımlı nesnelerin aileleri.

Çerçevelerde soyut fabrikalar genellikle bağımlılık enjeksiyonu kullanılarak sağlanır ve bu, sınanması kolay olan kod yazmanın gerçek anahtarıdır. Bağımlılık enjeksiyonu, sadece bağımlılıkların sınıf içinde yenilenmek yerine kurucudan "enjekte edildiği" anlamına gelir.

public class EasyGameFactory implements GameFactory 
{ 
    Dice createDice() 
    { 
    return new LuckyDice(); 
    } 
} 

public class NormalGameFactory implements GameFactory 
{ 
    Dice createDice() 
    { 
    return new RandomDice(); 
    } 
} 

birim test amaçlı olarak gerçekten Zar uygulamalarının ne kullanmayı tercih ediyorum:

Eğer tavla kolay ve sert oyunlar için (burada sadece bir bağımlılık, Zar) bağımlılıkları üretmek için iki fabrika kullanmak varsayalım Eğer GameFactory özel bir uygulama yazmak, böylece:

public class CustomGameFactory implements GameFactory 
{ 
    private Dice mDice; 

    public CustomGameFactory(Dice dice) 
    { 
    mDice = dice; 
    } 

    Dice createDice() 
    { 
    return mDice; 
    } 
} 

Bu fabrika üretim kodu ağacının parçası olmak zorunda değildir. Sen Test kodu ile Zar özel uygulaması ile fabrika kaynağı: herhangi bir somut bağımlılık test amaçlı enjekte edilebilir Bu yaklaşımla

public class TestBackgammon 
{ 
    @Test public void shouldReturnDiceThrown() 
    { 
    SettableDice dice = new SettableDice(); 
    Game game = new GameImpl(new CustomGameFactory(dice)); 

    dice.setDice(new int[] {4, 5}); 
    game.nextTurn(); 
    assertArrayEquals(new int[] {4, 5}, game.diceThrown()); 
    } 
} 

. Bununla birlikte, çoğu kez bir Soyut Fabrika olmadan, yani bir fabrikanın enjekte edilmesi yerine, aynı şekilde elde edilebilir, bağımlılığın kendisi enjekte edilebilir.