मेरे लिए, जाने का रास्ता इंटरफेस और फैक्टरी होगा। एक जो विभिन्न स्थानों को छुपा सकता है, जिसके पीछे इंटरफेस का संदर्भ देता है। जो कक्षाएं वास्तविक ग्रन्ट काम करती हैं, उन्हें सभी को कारखाने के साथ पंजीकृत करने की आवश्यकता होती है, ताकि यह पता चल सके कि किस वर्ग ने मापदंडों का एक सेट तुरंत दिया है।
नोट: इंटरफेस के बजाय आप एब्सट्रैक्ट बेस क्लासेस का भी इस्तेमाल कर सकते हैं, लेकिन इसका दोष यह है कि सिंगल इनहेरिटेंस भाषाओं के लिए यह आपको सिंगल बेस क्लास तक सीमित करता है।
TRepresentationType = (rtImage, rtTable, rtGraph, ...);
Factory.RegisterReader(TJSONReader, 'json');
Factory.RegisterReader(TXMLReader, 'xml');
Factory.RegisterWriter(TPDFWriter, 'pdf');
Factory.RegisterWriter(TPowerPointWriter, 'ppt');
Factory.RegisterWriter(TWordWriter, 'doc');
Factory.RegisterWriter(TWordWriter, 'docx');
Factory.RegisterRepresentation(TPNGImage, rtImage, 'png');
Factory.RegisterRepresentation(TGIFImage, rtImage, 'gif');
Factory.RegisterRepresentation(TJPGImage, rtImage, 'jpg');
Factory.RegisterRepresentation(TCsvTable, rtTable, 'csv');
Factory.RegisterRepresentation(THTMLTable, rtTable, 'html');
Factory.RegisterRepresentation(TBarChart, rtTGraph, 'bar');
Factory.RegisterRepresentation(TPieChart, rtTGraph, 'pie');
कोड डेल्फी (पास्कल) सिंटैक्स में है क्योंकि यह वह भाषा है जिसके साथ मैं सबसे अधिक परिचित हूं।
सभी कार्यान्वयन कक्षाएं कारखाने के साथ पंजीकृत होने के बाद, आपको ऐसे वर्ग के उदाहरण के लिए इंटरफ़ेस संदर्भ का अनुरोध करने में सक्षम होना चाहिए। उदाहरण के लिए:
Factory.GetReader('SomeFileName.xml');
Factory.GetWriter('SomeExportFileName.ppt');
Factory.GetRepresentation(rtTable, 'html');
TXMLReader के उदाहरण के लिए एक IReader संदर्भ लौटाना चाहिए; TPWPointWriter की एक आवृत्ति के लिए एक IWriter संदर्भ और THTMLPable की आवृत्ति के लिए एक IRepresentation संदर्भ।
अब सभी रेंडरिंग इंजन को करने की जरूरत है, सब कुछ एक साथ टाई है:
procedure Render(
aDataFile: string;
aExportFile: string;
aRepresentationType: TRepresentationType;
aFormat: string;
);
var
Reader: IReader;
Writer: IWriter;
Representation: IRepresentation;
begin
Reader := Factory.GetReaderFor(aDataFile);
Writer := Factory.GetWriterFor(aExportFile);
Representation := Factory.GetRepresentationFor(aRepresentationType, aFormat);
Representation.ConstructFrom(Reader);
Writer.SaveToFile(Representation);
end;
IReader इंटरफ़ेस को डेटा के प्रतिनिधित्व का निर्माण करने के लिए IRepresentation कार्यान्वयनकर्ताओं द्वारा आवश्यक डेटा को पढ़ने के तरीके प्रदान करने चाहिए। इसी तरह IRepresentation को ऐसे तरीके प्रदान करने चाहिए जो IWriter कार्यान्वयनकर्ताओं को अनुरोधित निर्यात फ़ाइल प्रारूप में डेटा प्रतिनिधित्व को निर्यात करने की आवश्यकता हो।
मान लें कि आपकी फ़ाइलों में डेटा प्रकृति में सारणीबद्ध है, IReader और इसके सहायक इंटरफेस इस तरह दिख सकते हैं:
IReader = interface(IInterface)
function MoveNext: Boolean;
function GetCurrent: IRow;
end;
IRow = interface(IInterface)
function MoveNext: Boolean;
function GetCurrent: ICol;
end;
ICol = interface(IInterface)
function GetName: string;
function GetValue: Variant;
end;
एक मेज पर घूमना फिर बात होगी
while Reader.MoveNext do
begin
Row := Reader.GetCurrent;
while Row.MoveNext do
begin
Col := Row.GetCurrent;
// Do something with the column's name or value
end;
end;
जैसा कि अभ्यावेदन प्रकृति में चित्र, रेखांकन और शाब्दिक हो सकते हैं, IRepresentation में एक निर्मित तालिका को पार करने के लिए IReader के समान तरीके होंगे और इसमें चित्र और रेखांकन प्राप्त करने के तरीके होंगे, उदाहरण के लिए बाइट्स की एक धारा के रूप में। यह IWriter कार्यान्वयनकर्ताओं के लिए होगा जो निर्यात लक्ष्य द्वारा आवश्यक तालिका मान और छवि / ग्राफ़ बाइट्स को एन्कोड करें।