تصميم الفصل وفقًا لنمط المصنع التجريدي ومرصع

StackOverflow https://stackoverflow.com/questions/3450518

  •  27-09-2019
  •  | 
  •  

سؤال

ما هي الطريقة الصحيحة لتوفير القيم لطريقة المصنع المجردة؟

على سبيل المثال.

interface IFactory
{
  ISomething Create(int runTimeValue);
}

class Factory : IFactory
{
  public ISomething Create(int runTimeValue)
  {
    return new Something(repository, runTimeValue);
  }
}

في المثال ، يتم حقن المستودع عبر المنشئ عند إنشاء المصنع ، لكن يمكنني بدلاً من ذلك نقل المستودع إلى الواجهة غير المقدمة

interface IFactory
{
  ISomething Create(IRepository repository, int runTimeValue);
}

class Factory : IFactory
{
  public ISomething Create(IRepository repository, int runTimeValue)
  {
    return new Something(repository, runTimeValue);
  }
}

ما هي الطريقة "الصحيحة" للقيام بذلك؟ كيف ينبغي أن يكون أحد الأسباب عند تصميم مصنع مجردة؟

هل كانت مفيدة؟

المحلول

نمط المصنع التجريدي يجب استخدامها في الحالات التي يجب أن يتم فيها "تهيئة" الكائنات التي يتم إرجاعها بواسطة المصنع بطريقة مختلفة بطريقة لا يعرف سوى المصنع كيفية القيام بذلك. سيتم "تهيئة" التطبيقات المختلفة لـ Isomething أو تم إنشاؤها بشكل مختلف ولا تعرف تطبيقات المصنع الخاصة بكل منها سوى كيفية القيام بذلك.

في حالتك ، عليك أن تسأل نفسك:

يفعل الكل تحتاج تطبيقات isomethings إلى iRepository وكذلك RuntimeValue؟. في هذه الحالة ، يمكنك فقط استخدام نمط المصنع.

استخدم مصنع مجردة في مثل هذا السيناريو: (يتم إنشاء شيء ما وبعض الشيء بشكل مختلف)

interface IFactory {
  ISomething Create(int runTimeValue);
}

class Factory : IFactory {
  public ISomething Create(int runTimeValue)  {
    return new Something(repository, runTimeValue);
  }
}

class OFactory : IFactory {
  public ISomething Create(int runTimeValue) {
    // constructor takes different parameters
    SomeOtherthing thing = new SomeOtherthing("someValue", runtimeValue);
    thing.SetCustomRepository(new OtherRepositoryImpl());
    return thing;
  }
}

نصائح أخرى

أود أن أقول أن تكون متسقة. إذا تم حقن مستودعك في كل مكان آخر يتم استخدامه ، فمن المنطقي حقنه في مُنشئ المصنع بدلاً من جعله جزءًا من الواجهة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top