في كتاب الدكتور يان هونغ "Java and Mode" ، يبدأ بوصف وضع وزن الذبابة:
يشير وزن الذبابة إلى أخف مستوى الوزن ، أي "وزن الذبابة" أو "مستوى المطر". يتم اختيار ترجمة "وضع Xienyuan" هنا لأن هذا يمكن أن يعكس بشكل أفضل نية الوضع. نمط الموسوعة هو النمط الهيكلي للكائن. يدعم وضع الموسوعة بكفاءة عددًا كبيرًا من الكائنات ذات الحبيبات الدقيقة بطريقة مشتركة.
نوع السلسلة في جافا
في لغة Java ، يستخدم نوع السلسلة وضع الموسوعة. كائن السلسلة من النوع النهائي ولا يمكن تغييره بمجرد إنشائه. في جافا ، توجد ثوابت السلسلة في البركة الثابتة. ستضمن Java أن ثابت السلسلة يحتوي على نسخة واحدة فقط في المجموعة الثابتة. السلسلة A = "ABC" ، حيث "ABC" ثابت السلسلة.
اختبار الفئة العامة {public static void main (string [] args) {string a = "abc" ؛ السلسلة B = "ABC" ؛ system.out.println (a == b) ؛ }}النتيجة في المثال أعلاه صحيحة ، مما يعني أن كلا من A و B تشير إلى نفس السلسلة الثابتة "ABC" في التجمع الثابت. يتجنب مثل هذا التصميم كميات كبيرة غير ضرورية من استهلاك الموارد الناتجة عند إنشاء N أو المزيد من الكائنات متطابقة.
هيكل نموذج التمتع
يتبنى نموذج التمتع بمشاركة لتجنب النفقات العامة لوجود كائن المحتوى نفسه. الشيء الأكثر شيوعًا وبديهية حول هذا النفقات العامة هو فقدان الذاكرة. مفتاح مشاركة كائن الموسوعة هو التمييز بين الحالة الداخلية والدولة الخارجية .
يتم تخزين حالة جوهرية داخل كائن Xiangyuan ولن تختلف باختلاف البيئة. لذلك ، يمكن أن يكون للعنصر الذبيحة حالة جوهرية ويمكن مشاركتها.
تتغير الحالة الخارجية مع تغيير البيئة ولا يمكن مشاركتها. يجب أن يتم حفظ الحالة الخارجية للكائن Xiangyuan من قبل العميل ، وبعد إنشاء كائن Xiangyuan ، يتم تمريره إلى كائن Xiangyuan عندما يحتاج إلى استخدامه. لا يمكن أن تؤثر الحالات الخارجية على الحالة الداخلية للكائن الحي ، فهي مستقلة عن بعضها البعض.
يمكن تقسيم وضع التمتع باليوان إلى شكلين: وضع التمتع باليوان والاستمتاع بوضع اليوان.
وضع التمتع بسيط
في الوضع البسيط ، يمكن مشاركة جميع الكائنات الموجودة.
الأدوار المشاركة في وضع التمتع البسيط هي كما يلي:
دور ذبابة الذبابة المجردة: يعطي واجهة مجردة لتحديد الطرق التي يجب تنفيذ جميع أدوار وزن الذبابة المحددة.
دور الوزن الخرساني: ينفذ الواجهة المحددة بواسطة دور Xiangyuan التجريدي. إذا كانت هناك حالة جوهرية ، فيجب أن تكون مسؤولاً عن توفير مساحة تخزين للحالة الجوهرية.
دور FlyweightFactory: هذا الدور مسؤول عن إنشاء وإدارة دور Xiangyuan. يجب أن يضمن هذا الدور مشاركة كائن التمتع بشكل صحيح من قبل النظام. عندما يقوم كائن عميل يدعو كائن Xiangyuan ، فإن دور مصنع Xiangyuan سيتحقق مما إذا كان هناك بالفعل كائن Xiangyuan يفي بالمتطلبات في النظام. إذا كان موجودًا بالفعل ، فيجب أن يوفر دور مصنع Xiangyuan كائن Xiangyuan الحالي ؛ إذا لم يكن هناك كائن Xiangyuan المناسب في النظام ، فيجب أن يخلق دور مصنع Xiangyuan كائن Xiangyuan مناسبًا.
رمز المصدر
فئة شخصية مجردة
الواجهة العامة ذبابة الذبابة {// طريقة تخطيفية ، حالة المعلمة هي عملية الفراغ العامة للدولة الخارجية (حالة السلسلة) ؛}لدى الخرسانة المحددة من فئة الأحرف الموسمية حالة جوهرية. في هذا المثال ، تمثل خاصية intrinsicstate من نوع الحرف ، ويجب تعيين قيمته عند إنشاء كائن الموسوعة. لن تتغير جميع الحالات الجوهرية بعد إنشاء الكائن.
إذا كان للكائن الذبيحة حالة خارجية ، فيجب تخزين جميع الحالات الخارجية على العميل. عند استخدام الكائن الذبيحة ، سيتم تمرير الكائن الذبيح إلى الكائن الذبيح من قبل العميل. لا يوجد سوى حالة خارجية واحدة هنا ، وتكون حالة المعلمة لطريقة التشغيل () هي الحالة الخارجية التي تم تمريرها من الخارج.
تنفذ ConcreteFlyweight من الطبقة العامة عن وزن الذبابة {private private intrinsicstate = null ؛ / *** مُنشئ ، يتم تمرير الحالة الجوهرية كمعلمة* @param*/ concretyflyweight (حالة الأحرف) {this.intrinsicstate = state ؛ } /** * يتم تمرير الحالة الخارجية كمعلمة في الطريقة ، وتغيير سلوك الطريقة ، * ولكن لا تغيير الحالة الجوهرية للكائن. */ Override Public Void Operation (String State) {// todo method method method system.out.println ("intrinsic state =" + this.intrinsicstate) ؛ system.out.println ("الحالة الخارجية =" + الحالة) ؛ }}بالنسبة لفئة دور مصنع Xiangyuan ، يجب الإشارة إلى أن العميل لا يمكنه إنشاء فئة Xiangyuan المحددة مباشرة ، ولكن يجب استخدام طريقة المصنع () للحصول على كائن Xiangyuan. بشكل عام ، لا يوجد سوى كائن مصنع Xiangyuan واحد في النظام بأكمله ، لذلك يمكن أيضًا استخدام وضع Singleton.
عندما يحتاج العميل إلى كائن متعة بسيط ، فإنه يحتاج إلى استدعاء طريقة المصنع للمصنع للاستمتاع بالاستمتاع بالوقوع الداخلي المطلوب للمصنع ، وتولد طريقة المصنع الكائن المطلوب.
الفئة العامة flyweightfactory {private map <Charfer ، flyweight> files = new hashmap <faracter ، flyweight> () ؛ مصنع وزن الذبابة العامة (حالة الأحرف) {// أولاً ، ابحث عن الكائن من ذرة ذبابة ذبابة ذبابة ذبابة = files.get (state) ؛ if (fly == null) {// إذا لم يكن الكائن موجودًا ، فقم بإنشاء كائن ذبابة جديد ذبابة = concreteflyweight (الحالة) الجديدة ؛ // أضف كائن وزن الذبابة الجديد إلى ملفات cache.put (الحالة ، الطيران) ؛ } إرجاع ذبابة ؛ }}فئة العميل
عميل الفئة العامة {public static void main (string [] args) {// todo method method method tuto cludweightfactory factory = new flyweightfactory () ؛ ذبابة الذبابة = مصنع. fly.operation ("المكالمة الأولى") ؛ fly = factory.factory (حرف جديد ('b')) ؛ fly.operation ("المكالمة الثانية") ؛ fly = factory.factory (حرف جديد ('a')) ؛ fly.operation ("المكالمة الثالثة") ؛ }}على الرغم من أن العميل تقدم بطلب لثلاثة كائنات قمعية ، إلا أنه لا يوجد سوى كائنات قمعية تم إنشاؤها بالفعل ، وهو ما يعنيه المشاركة. نتائج التشغيل كما يلي:
وضع التمتع المعقد
في وضع التمتع البسيط ، فإن جميع كائنات التمتع هي كائنات متعة بسيطة ، مما يعني أنه يمكن مشاركتها مباشرة. هناك أيضًا موقف أكثر تعقيدًا حيث يتم دمج بعض وضع تخليق الاستخدام الخارجي البسيط لتشكيل كائن خارجي مركب. لا يمكن مشاركة مثل هذه الكائنات المركبة في الوصلات الوصفية ، ولكن يمكن تقسيمها إلى كائنات ميتا-إنجوي بسيطة ، ويمكن مشاركة هذا الأخير.
الشخصيات المشاركة في شخصية Xiangyuan المركبة هي كما يلي:
دور ذبابة الذبابة المجردة: يعطي واجهة مجردة لتحديد الطرق التي يجب تنفيذ جميع أدوار وزن الذبابة المحددة.
دور الوزن الخرساني: ينفذ الواجهة المحددة بواسطة دور Xiangyuan التجريدي. إذا كانت هناك حالة جوهرية ، فيجب أن تكون مسؤولاً عن توفير مساحة تخزين للحالة الجوهرية.
دور compositecompositeflyweight: لا يمكن مشاركة الكائنات التي يمثلها حصة المركب ، ولكن يمكن أن يتحلل كائن حصة مركب إلى مجموعات متعددة من الكائنات التي تتقاسم ببساطة الكائنات. يسمى الدور الخارجي المركب أيضًا كائنًا خارجيًا غير مشترك.
دور FlyweightFactory: هذا الدور مسؤول عن إنشاء وإدارة دور Xiangyuan. يجب أن يضمن هذا الدور مشاركة كائن التمتع بشكل صحيح من قبل النظام. عندما يقوم كائن عميل يدعو كائن Xiangyuan ، فإن دور مصنع Xiangyuan سيتحقق مما إذا كان هناك بالفعل كائن Xiangyuan يفي بالمتطلبات في النظام. إذا كان موجودًا بالفعل ، فيجب أن يوفر دور مصنع Xiangyuan كائن Xiangyuan الحالي ؛ إذا لم يكن هناك كائن Xiangyuan المناسب في النظام ، فيجب أن يخلق دور مصنع Xiangyuan كائن Xiangyuan مناسبًا.
رمز المصدر
فئة شخصية مجردة
الواجهة العامة ذبابة الذبابة {// طريقة تخطيفية ، حالة المعلمة هي عملية الفراغ العامة للدولة الخارجية (حالة السلسلة) ؛} فئة دور متعة محددة
تنفذ ConcreteFlyweight من الطبقة العامة عن وزن الذبابة {private private intrinsicstate = null ؛ / *** مُنشئ ، يتم تمرير الحالة الجوهرية كمعلمة* @param*/ concretyflyweight (حالة الأحرف) {this.intrinsicstate = state ؛ } /** * يتم تمرير الحالة الخارجية كمعلمة في الطريقة ، وتغيير سلوك الطريقة ، * ولكن لا تغيير الحالة الجوهرية للكائن. */ Override Public Void Operation (String State) {// todo method method method system.out.println ("intrinsic state =" + this.intrinsicstate) ؛ system.out.println ("الحالة الخارجية =" + الحالة) ؛ }}يتكون الكائن الخارجي المركب من كائن خارجي نقي من خلال المركبة ، لذلك يوفر طريقة إدارة التجميع مثل Add (). نظرًا لأن كائن Meta المركبة يحتوي على عناصر إجمالية مختلفة ، تتم إضافة هذه العناصر الإجمالية بعد إنشاء كائن Meta المركب ، وهذا يعني بحد ذاته أن حالة كائن Meta المركب سيتغير ، لذلك لا يمكن مشاركة كائن Meta المركبة.
يقوم الدور الخارجي المركب بتنفيذ الواجهة المحددة بواسطة الدور الخارجي التجريدي ، أي طريقة التشغيل (). تحتوي هذه الطريقة على معلمة تمثل الحالة الخارجية للكائن الخارجي المركب. الحالات الخارجية لجميع عناصر كائن التمتع المركب تساوي الحالة الخارجية لكائن التمتع المركب ؛ في حين أن الحالات الداخلية لكائن التمتع البسيط الموجود في كائن التمتع المركب ليست متساوية بشكل عام ، وإلا فلن تكون هناك قيمة فائدة.
الطبقة العامة concreteCompositeflyweight تنفذ وزن الذبابة {خريطة خاصة <الحرف ، Flyweight> files = new hashmap <farter ، flyweight> () ؛ / *** إضافة كائن جديد بسيط لتوفير التلويح إلى الكتلة*/ public void add (مفتاح الحرف ، ذبابة الذبابة) {files.put (مفتاح ، ذبابة) ؛ } / *** يتم تمرير الحالة الخارجية إلى الطريقة كمعلمة* / Override Public Void Operation (String State) {flyweight fly = null ؛ لـ (Object o: files.keyset ()) {fly = files.get (o) ؛ fly.operation (الدولة) ؛ }}} يوفر دور مصنع Xiangyuan طريقتين مختلفتين ، واحدة لتوفير كائن Xiangyuan بسيط والآخر لتوفير كائن Xiangyuan مركب.
الفئة العامة flyweightfactory {private map <Charfer ، flyweight> files = new hashmap <faracter ، flyweight> () ؛ / *** COMPOUND XIANGYUAN FACKTORY Method*/ Public Flyweight Factory (LIST <CHARARE> COMPOSITESTATE) {concreteCompositeFlyweight Compositefly = New ConcreteCompositeFlyweight () ؛ لـ (حالة الأحرف: compositeState) {compositefly.add (State ، this.factory (state)) ؛ } return compositefly ؛ } /*** طريقة مصنع Encyclopedia البسيطة* /مصنع وزن الذبابة العامة (حالة الأحرف) {// أولاً ، ابحث عن الكائن من ذاكرة الذاكرة الذاكرة ذبابة الذبابة = files.get (الحالة) ؛ if (fly == null) {// إذا لم يكن الكائن موجودًا ، فقم بإنشاء كائن ذبابة جديد ذبابة = concreteflyweight (الحالة) الجديدة ؛ // أضف كائن وزن الذبابة الجديد إلى ملفات cache.put (الحالة ، الطيران) ؛ } إرجاع ذبابة ؛ }} أدوار العميل
client client {public static void main (string [] args) {list <forme> compositeState = new ArrayList <Former> () ؛ compositestate.add ('a') ؛ compositestate.add ('b') ؛ compositestate.add ('c') ؛ compositestate.add ('a') ؛ compositestate.add ('b') ؛ flyweightfactory flyfactory = new flyweightfactory () ؛ Flyweight CompositeFly1 = flyfactory.factory (compositeState) ؛ Flyweight CompositeFly2 = flyfactory.factory (compositeState) ؛ compositefly1.Operation ("المكالمة المركبة") ؛ System.out.println ("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- flyfactory.factory (State) ؛نتائج التشغيل كما يلي:
من نتائج العملية ، يمكن ملاحظة أن الحالة الخارجية لجميع عناصر كائن التمتع المركب تساوي الحالة الخارجية لكائن التمتع المركب. أي أن حالة الثروة الخارجية مساوية للمكالمة المركبة.
من نتائج العملية ، يمكن ملاحظة أن حالات الدلالة لكائن بسيط موجود في كائن موجود مركب غير متكافئ بشكل عام. أي أن الحالات الداخلية هي B و C و A.
من نتائج التشغيل ، يمكن ملاحظة أنه لا يمكن مشاركة كائن المشاركة المركبة. وهذا يعني أن الكائن الذي تم إنشاؤه باستخدام نفس الكائن compositeState من خلال المصنع مرتين ليس هو نفس الكائن.
من نتائج العملية ، يمكن ملاحظة أنه يمكن مشاركة ببساطة الاستمتاع بالعنصر. وهذا يعني أن الكائن الذي تم إنشاؤه من خلال المصنع مرتين باستخدام حالة الكائن نفسه هو نفس الكائن.
إيجابيات وسلبيات نموذج Xiangyuan
ميزة وضع الموسوعة هي أنه يقلل بشكل كبير من عدد الكائنات في الذاكرة. ومع ذلك ، فإن السعر الذي يدفعه للقيام بذلك مرتفع جدًا أيضًا:
وضع الموسوعة يجعل النظام أكثر تعقيدًا. من أجل مشاركة الكائنات ، تحتاج بعض الحالة إلى الخارج ، مما يعقد منطق البرنامج.
يقوم وضع التمتع بتجديد حالة كائن التمتع ، أثناء قراءة الحالة الخارجية تجعل وقت التشغيل لفترة أطول قليلاً.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.