كيف يمكنك استخدام Intefaces مع نمط المصنع في التصميم المعتمد على المجال؟

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

سؤال

هل من المنطقي استخدام واجهات لمصانع كائنات المجال الخاصة بك بشكل افتراضي، أم يجب حجز الواجهات لفئات المصنع فقط عندما تحتاج إليها؟

public IUserFactory
{
    User CreateNewUser();
}

public UserFactory : IUserFactory
{
    public User CreateNewUser()
    {
        return new User();
    }
}
هل كانت مفيدة؟

المحلول

وهنا ترجمة لنفس المشكلة في جاوة.

والمثال الأصلي

public interface UserFactoryIF
{
   User createNewUser();
}

وبعد ذلك تنفيذ مصنع

public class UserFactory implements UserFactoryIF
{
     public User createNewUser()
     {
         // whatever special logic it takes to make a User
         // below is simplification
         return new User();
     }
}

وأنا لا أرى أي فائدة خاصة لتحديد واجهة للمصنع، منذ كنت تحديد واجهة واحدة للمنتج مركزي. وعادة ما أجد أنني في حاجة إلى إنتاج العديد من تطبيقات مختلفة من نفس النوع من المنتجات، وبلدي مصنع يحتاج إلى استهلاك الكثير من أنواع مختلفة من المعلمات. وهذا هو، قد يكون لدينا:

public interface User
{
    public String getName();
    public long getId();
    public long getUUID();
    // more biz methods on the User
}

وقال إن المصنع تبدو هذه:

public class UserFactory {

    public static User createUserFrom(Person person) {
        // ...
        return new UserImpl( ... );
    }

    public static user createUserFrom(AmazonUser amazonUser) {
         // ... special logic for AmazonWS user
        return new UserImpl( ... );          
    }

    private static class UserImpl implements User {
       // encapsulated impl with validation semantics to
       // insure no one else in the production code can impl
       // this naively with side effects
    }
}

وهذا الأمل يحصل على نقطة عبر.

نصائح أخرى

في المثال الذي قدمته، لا أفهم حتى سبب حاجتك للذهاب إلى المصنع.

يتمثل جوهر نمط المصنع في "تحديد واجهة لإنشاء كائن ، ولكن دع الفئات الفرعية تقرر الفئة التي يجب إنشاء مثيل لها.تتيح طريقة المصنع لتأجيل الفصل الدراسي إلى الفئات الفرعية. " - ويكيبيديا

هل لديك نوع مختلف من المستخدمين، أم أن المستخدم بحد ذاته نوع من شيء ما.ربما لم توضح الأمر بوضوحنستخدم عادة واجهه المستخدم في نمط طريقة المصنع مجردة, ، حيث نحتاج إلى التعامل مع عائلات متعددة من الكائنات ذات الصلة.

ملحوظة:لا تنس أن الأنماط موجودة لمساعدتنا، وهذا لا يعني أنه يجب علينا استخدامها لأنها متوفرة، سواء كنا بحاجة إليها أم لا.

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

وهناك أمران: (1) فما استقاموا لكم فاستقيموا الانتظار حتى أنا في حاجة (أو رأى حاجة تلوح في الأفق) لتنفيذ البديل قبل فما استقاموا لكم فاستقيموا إنشاء واجهة و (2) واجهات جعل دائما تقريبا وحدة اختبار أسهل، خصوصا مع السخرية، وذلك وكثيرا ما تأتي مع الحاجة إلى واجهة على الفور.

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

إذا كنت لا تفكر في الاختبارات وحدة أو أنماط اللجنة الاولمبية الدولية (الآراء الدينية جانبا)، وأنا ربما لن يكلف نفسه عناء.

وأجد أكبر الألم مع استخدامها، في Visual Studio على الأقل، هو أن "الانتقال إلى تعريف" على خاصية أو وظيفة يقفز إلى تعريف واجهة، وليس تعريف الفئة.

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