أليس نمط المصنع هو نفس الشيء مثل الدولة العالمية؟

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

سؤال

دعنا نقول أن لدي فصل مثل هذا:

class MonkeyFish
{
   MonkeyFish( GlobalObjectA & a, GlobalObjectB & b, GlobalObjectC & c);

   private:
     GlobalObjectA & m_a;
     GlobalObjectB & m_b;
     GlobalObjectC & m_c;
}

بدون مصنع ، أحتاج إلى القيام بما يلي من أجل إنشاء مثيل MonkeyFish.

GlobalObjectA a;
GlobalObjectB b;
GlobalObjectC c;

int main()
{
  MonkeyFish * monkey_fish = new MonkeyFish(a, b, c);
  monkey_fish->go();
}

من ناحية أخرى ، إذا كان لدي MonkeyFishFactory, ، يبدو أنني يجب أن أفعل هذا:

GlobalObjectA a;
GlobalObjectB b;
GlobalObjectC c;

int main()
{
  MonkeyFishFactory mf_factory(a, b, c);
  MonkeyFish * monkey_fish = mf_factory.buildMonkeyFish("Bob");
  monkey_fish->go();
}
  1. لا يزال لدي أشياء عالمية.

  2. حتى لو خلق Monkeyfishfactory نفسه GlobalObjects داخليًا (لذلك فهي الآن داخل قرد أسماك الغيوم بدلاً من الكرات الحقيقية) ، يبدو أن Monkeyfishory بحد ذاتها ما زلت بحاجة إلى أن أكون كائنًا عالميًا حتى أتمكن من الوصول إليه في أي وقت أريد إنشاء ملف MonkeyFish.

أليس نمط المصنع هو نفس الشيء مثل الدولة العالمية في هذه الحالة؟

(أنا أعمل حاليًا على افتراض أن الدولة العالمية أمر سيء ، والقضاء عليها أمر جيد.)

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

المحلول

هل أنت مربك المفاهيم هنا؟

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

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

class IMonkeyFish {
public:
    virtual ~IMonkeyFish() = 0;
    virtual void go() = 0;
};

class Factory {
public:
    static Factory& instance();
    IMonkeyFish* createMonkeyFish();
protected:
    Factory(GlobalObjectA& a, GlobalObjectB& b, GlobalObjectC& c);
private:
    static Factory *theInstance;
    GlobalObjectA&  instanceOfA;
    GlobalObjectB&  instanceOfB;
    GlobalObjectC&  instanceOfC;
};

Factory& factory = Factory::instance();
IMonkeyFish* fishie = factory.createMonkeyFish();
fishie->go();

ال Singleton النمط يحكم إنشاء مثال المصنع. ال Factory يخفي النمط التفاصيل المحيطة بإنشاء كائنات تنفذ IMonkeyFish واجهه المستخدم. الشيء الجيد (TM) هو إخفاء الدولة العالمية وتفكك MonkeyFish تفاصيل ملموسة من إنشاء مثيل.

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

نصائح أخرى

الدولة العالمية ليست أمرًا سيئًا. عام الدولة العالمية شيء سيء. يساعد نمط المصنع على تغليف الحالة العالمية ، وهو أمر جيد.

لا توجد دولة عالمية في المصنع. إنه يخلق كائنات. لأنه ليس أي دولة في المصنع. لا بأس أن تكون عالميًا.

ليس عليك ترك الأشياء العالمية. يجب أن يخلق مصنع Monkey Fish تلك GlobalOjecta | B | C عند الطلب. باستخدام التبديل أو إذا كانت الطريقة الداخلية لتحديد أي طريقة.

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

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

int main()
{
  MonkeyFish * monkey_fish = MonkeyFishFactory::buildMonkeyFish("Bob");
  monkey_fish->go();
}

إشعار ، لا توجد كائنات عالمية ، و monkeyfishfactory غير مثبتة.

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

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

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

حاول أن تذكر بوضوح ما تحاول تحقيقه ، وربما ستحصل على إجابة أفضل.

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