public class AnimalFactory {

public Animal getAnimal(String type) {
    if ("dog".equals(type)) {
        return new Dog();
    } if ("bird".equals(type)) {
        return new bird();
    } else {
        return new Cat();
    }
  }
}

public static void main(String[] args) { 
  AnimalFactory animalFactory = new AnimalFactory();

Animal a1 = animalFactory.getAnimal("feline");
  System.out.println("a1 sound: " + a1.makeSound());

Animal a2 = animalFactory.getAnimal("canine");
  System.out.println("a2 sound: " + a2.makeSound());
}

Merhabalar sorumun açık olması için yukarı örnek bir kodda koydum. Bana göre String ile factory clasına bilgi geçmek kodu yarardan çok zarar götürmekte.İf veya switch yerine daha güzel bir yol izleyebilir miyim ? çünkü bu yapı kodu çalıştırcak kişilern factory clasını iyi bilmesini ve ona göre string parametresi geçmesini gerektirmekte bunu önlememin güzel bir yolunu sölerseniz çok sevinirim.

soruldu: 20 Şub '13, 18:09

melihbaba's gravatar image

melihbaba
2015812
cevap kabul oranı: 25%

değiştirildi: 21 Şub '13, 04:35

CemIkta's gravatar image

CemIkta ♦
19.9k29125190


Kendi projelerimde kullandığım tasarımı örnek vermek istiyorum. Backend paketinde interface arayüzü oluşturuyorum;

public interface IUseraccount {

        public abstract boolean             createUseraccount(Useraccount useraccount);
        ....
        ...
     }

Daha sonra bu arayüzü Implement ediyorum

public class UseraccountProcessImpl extends HibernateProcessImpl implements IUseraccount{

    Logger logger = LoggerFactory.getLogger(UseraccountProcessImpl.class);

    @Override
    public boolean createUseraccount(Useraccount useraccount) {

    }
    ...
    ..
}

Factory paketi oluşturup burada ProcessFactory sınıfı yazıyorum.

public class ProcessFactory {

    public static IUseraccount useraccountProcess(){
        return new UseraccountProcessImpl();
    }

    ....
    ..
    .
}

Çağırma işleminide bu şekilde yapıyorum

private IUseraccount iUseraccount = ProcessFactory.useraccountProcess();
iUseraccount.createUseraccount(...);
permanent link

cevaplandı: 21 Şub '13, 04:59

MDemir's gravatar image

MDemir
2.1k173445
cevap kabul oranı: 24%

değiştirildi: 21 Şub '13, 05:06

If ve switch için değil ama string için bir yol önerebilirim.

AnimalType adında bir enum oluşturup onu parametere alırsanız. Factory'yi kullanan kişilerin işi kesinlikle daha kolay olacaktır. Sizin tam istediğiniz cevap olmasa bile String kullanmaktan daha iyi bir yöntem olacaktır.

permanent link

cevaplandı: 21 Şub '13, 00:56

ibrahimdemir's gravatar image

ibrahimdemir
77068
cevap kabul oranı: 0%

Bir Attribute kullanip reflection ile cözüm getirebilir ama su anda bence factory pattern in yerini IoC (Inversion of Control) Container lar aldi.

Java tarafinda IoC leri tanimiyorum ama .Net icin Ninject ya da Unity önerebilirim. Ninject in factory ya da singleton gibi extension lari da var.

IoC leri incelemenizi öneririm.

Saygilar

permanent link

cevaplandı: 21 Şub '13, 01:51

tyaramis's gravatar image

tyaramis
303
cevap kabul oranı: 0%

1

IoC ile çözülebilir mi bilmiyorum. Eğer sınıf uzayınız belli ise kesinlikle IoC ile yapılabilir. Örneğin Çoklu db kullanıyorsanız. MySql ve Oracle için ayrı sınıf uzayları yarattıysanız , bir konfigurasyon ile hangisini ayağa kaldıracağını IoC'ye söyleyebilirsiniz. Ancak kod yazarken karar verecekseniz durum değişebilir.

(21 Şub '13, 02:33) ibrahimdemir ibrahimdemir's gravatar image

Yanliz senin soruda sordugun sekilde de sinif uzayin belli.

(21 Şub '13, 04:06) mahmut_can ♦ mahmut_can's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1,077
×5
×1

Soruldu: 20 Şub '13, 18:09

Görüntüleme: 719 kez

Son güncelleme: 21 Şub '13, 05:06

powered by BitNami OSQA