C# Language
फ्लाईवेट डिजाइन पैटर्न को लागू करना
खोज…
आरपीजी खेल में नक्शा लागू करना
फ्लाईवेट संरचनात्मक डिजाइन पैटर्न में से एक है। इसका उपयोग उपयोग की गई यादों की मात्रा को कम करने के लिए किया जाता है ताकि संभव वस्तुओं के साथ अधिक से अधिक डेटा साझा किया जा सके। यह दस्तावेज़ आपको सिखाएगा कि फ्लाईवेट डीपी का सही उपयोग कैसे करें।
मुझे इसका उदाहरण एक सरल उदाहरण पर समझाता हूं। कल्पना कीजिए कि आप एक आरपीजी गेम पर काम कर रहे हैं और आपको बड़ी फ़ाइल लोड करने की आवश्यकता है जिसमें कुछ वर्ण हैं। उदाहरण के लिए:
-
#
घास है। आप इस पर चल सकते हैं। -
$
बिंदु शुरू कर रहा है -
@
चट्टान है। आप उस पर नहीं चल सकते। -
%
खजाना छाती है
मानचित्र का नमूना:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@############@@@@@######@#$@@@
@#############@@@######@###@@@
@#######%######@###########@@@
@############################@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
चूँकि उन वस्तुओं में कोई विशिष्ट विशेषता नहीं है, इसलिए आपको प्रत्येक मानचित्र फ़ील्ड के लिए अलग ऑब्जेक्ट बनाने की आवश्यकता नहीं है। मैं आपको दिखाऊंगा कि फ्लाईवेट का उपयोग कैसे किया जाता है।
आइए एक इंटरफ़ेस परिभाषित करें जिसे हमारे क्षेत्र कार्यान्वित करेंगे:
public interface IField
{
string Name { get; }
char Mark { get; }
bool CanWalk { get; }
FieldType Type { get; }
}
अब हम ऐसी कक्षाएं बना सकते हैं जो हमारे क्षेत्रों का प्रतिनिधित्व करती हैं। हमें उन्हें किसी भी तरह पहचानना होगा (मैंने एक गणना का उपयोग किया):
public enum FieldType
{
GRASS,
ROCK,
START,
CHEST
}
public class Grass : IField
{
public string Name { get { return "Grass"; } }
public char Mark { get { return '#'; } }
public bool CanWalk { get { return true; } }
public FieldType Type { get { return FieldType.GRASS; } }
}
public class StartingPoint : IField
{
public string Name { get { return "Starting Point"; } }
public char Mark { get { return '$'; } }
public bool CanWalk { get { return true; } }
public FieldType Type { get { return FieldType.START; } }
}
public class Rock : IField
{
public string Name { get { return "Rock"; } }
public char Mark { get { return '@'; } }
public bool CanWalk { get { return false; } }
public FieldType Type { get { return FieldType.ROCK; } }
}
public class TreasureChest : IField
{
public string Name { get { return "Treasure Chest"; } }
public char Mark { get { return '%'; } }
public bool CanWalk { get { return true; } } // you can approach it
public FieldType Type { get { return FieldType.CHEST; } }
}
जैसा मैंने कहा, हमें प्रत्येक क्षेत्र के लिए अलग उदाहरण बनाने की आवश्यकता नहीं है। हमें खेतों का भंडार बनाना होगा। फ्लाईवेट डीपी का सार यह है कि हम गतिशील रूप से केवल एक वस्तु बनाते हैं यदि हमें इसकी आवश्यकता होती है और यह हमारे रेपो में अभी तक मौजूद नहीं है, या यदि यह पहले से मौजूद है तो इसे वापस कर दें। आइए सरल वर्ग लिखें जो हमारे लिए इसे संभालेंगे:
public class FieldRepository
{
private List<IField> lstFields = new List<IField>();
private IField AddField(FieldType type)
{
IField f;
switch(type)
{
case FieldType.GRASS: f = new Grass(); break;
case FieldType.ROCK: f = new Rock(); break;
case FieldType.START: f = new StartingPoint(); break;
case FieldType.CHEST:
default: f = new TreasureChest(); break;
}
lstFields.Add(f); //add it to repository
Console.WriteLine("Created new instance of {0}", f.Name);
return f;
}
public IField GetField(FieldType type)
{
IField f = lstFields.Find(x => x.Type == type);
if (f != null) return f;
else return AddField(type);
}
}
महान! अब हम अपने कोड का परीक्षण कर सकते हैं:
public class Program
{
public static void Main(string[] args)
{
FieldRepository f = new FieldRepository();
IField grass = f.GetField(FieldType.GRASS);
grass = f.GetField(FieldType.ROCK);
grass = f.GetField(FieldType.GRASS);
}
}
कंसोल में परिणाम होना चाहिए:
ग्रास का एक नया उदाहरण बनाया
रॉक का एक नया उदाहरण बनाया
लेकिन घास केवल एक बार क्यों दिखाई देती है अगर हम इसे दो बार प्राप्त करना चाहते हैं? ऐसा इसलिए है क्योंकि पहली बार जब हम GetField
घास का उदाहरण देते हैं, तो हमारे भंडार में मौजूद नहीं होता है , इसलिए इसे बनाया जाता है, लेकिन अगली बार जब हमें घास की जरूरत होती है तो यह पहले से मौजूद होती है, इसलिए हम इसे वापस कर देते हैं।