CodeGym /జావా బ్లాగ్ /యాదృచ్ఛికంగా /డిజైన్ నమూనాలు: వియుక్త కర్మాగారం
John Squirrels
స్థాయి
San Francisco

డిజైన్ నమూనాలు: వియుక్త కర్మాగారం

సమూహంలో ప్రచురించబడింది
హాయ్! ఈ రోజు మనం డిజైన్ నమూనాలను అధ్యయనం చేయడం కొనసాగిస్తాము మరియు మేము వియుక్త ఫ్యాక్టరీ నమూనాను చర్చిస్తాము. డిజైన్ నమూనాలు: వియుక్త కర్మాగారం - 1ఇక్కడ మేము పాఠంలో కవర్ చేస్తాము:
  • వియుక్త కర్మాగారం అంటే ఏమిటి మరియు ఈ నమూనా ఏ సమస్యను పరిష్కరిస్తుందో మేము చర్చిస్తాము
  • వినియోగదారు ఇంటర్‌ఫేస్ ద్వారా కాఫీని ఆర్డర్ చేయడం కోసం మేము క్రాస్-ప్లాట్‌ఫారమ్ అప్లికేషన్ యొక్క అస్థిపంజరాన్ని సృష్టిస్తాము
  • మేము రేఖాచిత్రం మరియు కోడ్‌ని చూడటంతోపాటు ఈ నమూనాను ఎలా ఉపయోగించాలో సూచనలను అధ్యయనం చేస్తాము
  • మరియు బోనస్‌గా, ఈ పాఠంలో దాచిన ఈస్టర్ గుడ్డు ఉంది, ఇది ఆపరేటింగ్ సిస్టమ్ పేరును నిర్ణయించడానికి జావాను ఎలా ఉపయోగించాలో తెలుసుకోవడానికి మరియు ఫలితాన్ని బట్టి, ఒకదానికొకటి లేదా మరొక చర్యను నిర్వహించడానికి మీకు సహాయపడుతుంది.
ఈ నమూనాను పూర్తిగా అర్థం చేసుకోవడానికి, మీరు ఈ క్రింది అంశాలలో బాగా ప్రావీణ్యం కలిగి ఉండాలి:
  • జావాలో వారసత్వం
  • జావాలో వియుక్త తరగతులు మరియు పద్ధతులు

వియుక్త కర్మాగారం ఏ సమస్యలను పరిష్కరిస్తుంది?

ఒక వియుక్త కర్మాగారం, అన్ని ఫ్యాక్టరీ నమూనాల మాదిరిగానే, కొత్త వస్తువులను సరిగ్గా సృష్టించేలా చూసుకోవడానికి మాకు సహాయపడుతుంది. పరస్పరం అనుసంధానించబడిన వస్తువుల యొక్క వివిధ కుటుంబాల "ఉత్పత్తి"ని నిర్వహించడానికి మేము దీనిని ఉపయోగిస్తాము. పరస్పరం అనుసంధానించబడిన వస్తువుల యొక్క వివిధ కుటుంబాలు... దాని అర్థం ఏమిటి? చింతించకండి: ఆచరణలో, ప్రతిదీ అనిపించే దానికంటే చాలా సులభం. ప్రారంభించడానికి, ఒకదానితో ఒకటి అనుసంధానించబడిన వస్తువుల కుటుంబం ఎలా ఉంటుంది? మేము అనేక రకాల యూనిట్లతో కూడిన సైనిక వ్యూహాన్ని అభివృద్ధి చేస్తున్నామని అనుకుందాం:
  • పదాతి దళం
  • అశ్వికదళం
  • ఆర్చర్స్
ఈ రకమైన యూనిట్లు పరస్పరం అనుసంధానించబడి ఉంటాయి, ఎందుకంటే అవి ఒకే సైన్యంలో పనిచేస్తాయి. పైన జాబితా చేయబడిన వర్గాలు పరస్పరం అనుసంధానించబడిన వస్తువుల కుటుంబం అని మేము చెప్పగలము. మేము దీనిని అర్థం చేసుకున్నాము. కానీ నైరూప్య కర్మాగారం నమూనా పరస్పరం అనుసంధానించబడిన వస్తువుల యొక్క వివిధ కుటుంబాల సృష్టిని ఏర్పాటు చేయడానికి ఉపయోగించబడుతుంది. ఇక్కడ కూడా సంక్లిష్టంగా ఏమీ లేదు. సైనిక వ్యూహం ఉదాహరణతో కొనసాగిద్దాం. సాధారణంగా చెప్పాలంటే, సైనిక విభాగాలు అనేక విభిన్న పోరాట పార్టీలకు చెందినవి. వారు ఎవరి వైపు ఉన్నారనే దానిపై ఆధారపడి, సైనిక విభాగాలు ప్రదర్శనలో గణనీయంగా మారవచ్చు. రోమన్ సైన్యంలోని కాలినడక సైనికులు, గుర్రపు సైనికులు మరియు ఆర్చర్లు వైకింగ్ ఫుట్ సైనికులు, గుర్రపు సైనికులు మరియు ఆర్చర్ల వలె కాదు. సైనిక వ్యూహంలో, వివిధ సైన్యాల సైనికులు పరస్పరం అనుసంధానించబడిన వస్తువుల యొక్క విభిన్న కుటుంబాలు. ప్రోగ్రామర్ అయితే ఫన్నీగా ఉంటుంది' అతని పొరపాటు నెపోలియన్ కాలం నాటి ఫ్రెంచ్ యూనిఫాంలో ఒక సైనికుడు, సిద్ధంగా ఉన్న మస్కెట్, రోమన్ పదాతిదళం యొక్క శ్రేణుల మధ్య నడుస్తున్నట్లు గుర్తించబడింది. ఈ సమస్యను పరిష్కరించడానికి వియుక్త ఫ్యాక్టరీ డిజైన్ నమూనా ఖచ్చితంగా అవసరం. కాదు, టైమ్ ట్రావెల్ నుండి వచ్చే ఇబ్బంది సమస్య కాదు, కానీ పరస్పరం అనుసంధానించబడిన వస్తువుల యొక్క వివిధ సమూహాలను సృష్టించే సమస్య. ఒక వియుక్త కర్మాగారం అందుబాటులో ఉన్న అన్ని ఉత్పత్తులను (వస్తువుల కుటుంబం) సృష్టించడానికి ఇంటర్‌ఫేస్‌ను అందిస్తుంది. ఒక వియుక్త కర్మాగారం సాధారణంగా బహుళ అమలులను కలిగి ఉంటుంది. వాటిలో ప్రతి ఒక్కటి కుటుంబానికి చెందిన ఉత్పత్తులను రూపొందించడానికి బాధ్యత వహిస్తుంది. మా సైనిక వ్యూహంలో వియుక్త పాద సైనికులు, ఆర్చర్లు మరియు అశ్విక దళాన్ని సృష్టించే వియుక్త కర్మాగారం అలాగే ఈ ఫ్యాక్టరీ అమలులు ఉంటాయి. ఉదాహరణకి, రోమన్ సైనికులను సృష్టించే కర్మాగారం మరియు కార్తజీనియన్ సైనికులను సృష్టించే కర్మాగారం. సంగ్రహణ అనేది ఈ నమూనా యొక్క అత్యంత ముఖ్యమైన మార్గదర్శక సూత్రం. ఫ్యాక్టరీ యొక్క క్లయింట్లు ఫ్యాక్టరీ మరియు దాని ఉత్పత్తులతో కేవలం వియుక్త ఇంటర్‌ఫేస్‌ల ద్వారా మాత్రమే పని చేస్తారు. ఫలితంగా, ప్రస్తుతం ఏ సైనికులు సృష్టించబడుతున్నారనే దాని గురించి మీరు ఆలోచించాల్సిన అవసరం లేదు. బదులుగా, మీరు ఈ బాధ్యతను వియుక్త కర్మాగారం యొక్క నిర్దిష్ట అమలుకు పంపుతారు.

మన కాఫీ షాప్‌ని ఆటోమేట్ చేయడాన్ని కొనసాగిద్దాం

చివరి పాఠంలో, మేము ఫ్యాక్టరీ పద్ధతి నమూనాను అధ్యయనం చేసాము. మేము మా కాఫీ వ్యాపారాన్ని విస్తరించడానికి మరియు అనేక కొత్త స్థానాలను తెరవడానికి దీనిని ఉపయోగించాము. ఈ రోజు మేము మా వ్యాపారాన్ని ఆధునీకరించడాన్ని కొనసాగిస్తాము. వియుక్త ఫ్యాక్టరీ నమూనాను ఉపయోగించి, మేము ఆన్‌లైన్‌లో కాఫీని ఆర్డర్ చేయడానికి కొత్త డెస్క్‌టాప్ అప్లికేషన్‌కు పునాది వేస్తాము. డెస్క్‌టాప్ అప్లికేషన్‌ను వ్రాసేటప్పుడు, మేము ఎల్లప్పుడూ క్రాస్-ప్లాట్‌ఫారమ్ మద్దతు గురించి ఆలోచించాలి. మా అప్లికేషన్ తప్పనిసరిగా MacOS మరియు Windows రెండింటిలోనూ పని చేయాలి (స్పాయిలర్: మీరు హోంవర్క్‌గా అమలు చేయడానికి Linux కోసం మద్దతు మిగిలి ఉంది). మా అప్లికేషన్ ఎలా ఉంటుంది? చాలా సులభం: ఇది టెక్స్ట్ ఫీల్డ్, ఎంపిక ఫీల్డ్ మరియు బటన్‌తో కూడిన ఫారమ్ అవుతుంది. మీకు వేర్వేరు ఆపరేటింగ్ సిస్టమ్‌లను ఉపయోగించి అనుభవం ఉన్నట్లయితే, Windowsలోని బటన్‌లు Mac కంటే భిన్నంగా రెండర్ చేయబడతాయని మీరు ఖచ్చితంగా గమనించారు. మిగతావన్నీ అలాగే... సరే, ప్రారంభిద్దాం.
  • బటన్లు
  • టెక్స్ట్ ఫీల్డ్‌లు
  • ఎంపిక ఫీల్డ్‌లు
onClickనిరాకరణ: ప్రతి ఇంటర్‌ఫేస్‌లో, మేము , onValueChanged, లేదా వంటి పద్ధతులను నిర్వచించవచ్చు onInputChanged. మరో మాటలో చెప్పాలంటే, వివిధ ఈవెంట్‌లను నిర్వహించడానికి మమ్మల్ని అనుమతించే పద్ధతులను మేము నిర్వచించగలము (ఒక బటన్‌ను నొక్కడం, వచనాన్ని నమోదు చేయడం, ఎంపిక పెట్టెలో విలువను ఎంచుకోవడం). ఉదాహరణను ఓవర్‌లోడ్ చేయకూడదని మరియు మేము ఫ్యాక్టరీ నమూనాను అధ్యయనం చేస్తున్నప్పుడు దానిని స్పష్టంగా చెప్పడానికి ఇవన్నీ ఉద్దేశపూర్వకంగా ఇక్కడ విస్మరించబడ్డాయి. మా ఉత్పత్తుల కోసం వియుక్త ఇంటర్‌ఫేస్‌లను నిర్వచిద్దాం:

public interface Button {}
public interface Select {}
public interface TextField {}
ప్రతి ఆపరేటింగ్ సిస్టమ్ కోసం, మేము ఆపరేటింగ్ సిస్టమ్ శైలిలో ఇంటర్ఫేస్ మూలకాలను సృష్టించాలి. మేము Windows మరియు MacOS కోసం కోడ్‌ని వ్రాస్తాము. Windows కోసం అమలులను సృష్టిద్దాం:

public class WindowsButton implements Button {
}

public class WindowsSelect implements Select {
}

public class WindowsTextField implements TextField {
}
ఇప్పుడు మేము MacOS కోసం అదే చేస్తాము:

public class MacButton implements Button {
}

public class MacSelect implements Select {
}

public class MacTextField implements TextField {
}
అద్భుతమైన. ఇప్పుడు మనం మా వియుక్త ఫ్యాక్టరీకి వెళ్లవచ్చు, ఇది అందుబాటులో ఉన్న అన్ని నైరూప్య ఉత్పత్తి రకాలను సృష్టిస్తుంది:

public interface GUIFactory {

    Button createButton();
    TextField createTextField();
    Select createSelect();

}
అద్భుతమైన. మీరు గమనిస్తే, మేము ఇంకా సంక్లిష్టంగా ఏమీ చేయలేదు. అనుసరించే ప్రతిదీ కూడా సులభం. ఉత్పత్తులతో సారూప్యత ద్వారా, మేము ప్రతి OS కోసం వివిధ ఫ్యాక్టరీ అమలులను సృష్టిస్తాము. విండోస్‌తో ప్రారంభిద్దాం:

public class WindowsGUIFactory implements GUIFactory {
    public WindowsGUIFactory() {
        System.out.println("Creating GUIFactory for Windows OS");
    }

    public Button createButton() {
        System.out.println("Creating Button for Windows OS");
        return new WindowsButton();
    }

    public TextField createTextField() {
        System.out.println("Creating TextField for Windows OS");
        return new WindowsTextField();
    }

    public Select createSelect() {
        System.out.println("Creating Select for Windows OS");
        return new WindowsSelect();
    }
}
ఏమి జరుగుతుందో మరింత వివరించడానికి మేము పద్ధతులు మరియు కన్స్ట్రక్టర్‌లో కొంత కన్సోల్ అవుట్‌పుట్‌ని జోడించాము. ఇప్పుడు MacOS కోసం:

public class MacGUIFactory implements GUIFactory {
    public MacGUIFactory() {
        System.out.println("Creating GUIFactory for macOS");
    }

    @Override
    public Button createButton() {
        System.out.println("Creating Button for macOS");
        return new MacButton();
    }

    @Override
    public TextField createTextField() {
        System.out.println("Creating TextField for macOS");
        return new MacTextField();
    }

    @Override
    public Select createSelect() {
        System.out.println("Creating Select for macOS");
        return new MacSelect();
    }
}
ప్రతి పద్ధతి సంతకం పద్ధతి ఒక వియుక్త రకాన్ని చూపుతుందని గమనించండి. కానీ పద్ధతుల లోపల, మేము ఉత్పత్తుల యొక్క నిర్దిష్ట అమలులను సృష్టిస్తున్నాము. నిర్దిష్ట సందర్భాల సృష్టిని మేము నియంత్రించగల ఏకైక స్థలం ఇది. ఇప్పుడు ఫారమ్ కోసం క్లాస్ రాయడానికి సమయం ఆసన్నమైంది. ఇది జావా క్లాస్, దీని ఫీల్డ్‌లు ఇంటర్‌ఫేస్ మూలకాలు:

public class CoffeeOrderForm {
    private final TextField customerNameTextField;
    private final Select coffeeTypeSelect;
    private final Button orderButton;

    public CoffeeOrderForm(GUIFactory factory) {
        System.out.println("Creating coffee order form");
        customerNameTextField = factory.createTextField();
        coffeeTypeSelect = factory.createSelect();
        orderButton = factory.createButton();
    }
}
ఇంటర్‌ఫేస్ ఎలిమెంట్‌లను సృష్టించే ఒక అబ్‌స్ట్రాక్ట్ ఫ్యాక్టరీ ఫారమ్ యొక్క కన్స్ట్రక్టర్‌కు పంపబడుతుంది. నిర్దిష్ట OS కోసం ఇంటర్‌ఫేస్ ఎలిమెంట్‌లను రూపొందించడానికి అవసరమైన ఫ్యాక్టరీ అమలును మేము కన్‌స్ట్రక్టర్‌కు పంపుతాము.

public class Application {
    private CoffeeOrderForm coffeeOrderForm;

    public void drawCoffeeOrderForm() {
        // Determine the name of the operating system through System.getProperty()
        String osName = System.getProperty("os.name").toLowerCase();
        GUIFactory guiFactory;

        if (osName.startsWith("win")) { // For Windows
            guiFactory = new WindowsGUIFactory();
        } else if (osName.startsWith("mac")) { // For Mac
            guiFactory = new MacGUIFactory();
        } else {
            System.out.println("Unknown OS. Unable to draw form :(");
            return;
        }
        coffeeOrderForm = new CoffeeOrderForm(guiFactory);
    }

    public static void main(String[] args) {
        Application application = new Application();
        application.drawCoffeeOrderForm();
    }
}
మేము విండోస్‌లో అప్లికేషన్‌ను అమలు చేస్తే, మేము ఈ క్రింది అవుట్‌పుట్‌ను పొందుతాము:

Creating GUIFactory for Windows OS
Creating coffee order form
Creating TextField for Windows OS
Creating Select for Windows OS
Creating Button for Windows OS
Macలో, అవుట్‌పుట్ క్రింది విధంగా ఉంటుంది:

Creating GUIFactory for macOS
Creating coffee order form
Creating TextField for macOS
Creating Select for macOS
Creating Button for macOS
Linuxలో:

Unknown OS. Unable to draw form :( 
మరియు ఇప్పుడు మేము సంగ్రహించాము. మేము GUI-ఆధారిత అప్లికేషన్ యొక్క అస్థిపంజరాన్ని వ్రాసాము, దీనిలో ఇంటర్ఫేస్ మూలకాలు సంబంధిత OS కోసం ప్రత్యేకంగా సృష్టించబడతాయి. మేము సృష్టించిన వాటిని క్లుప్తంగా పునరావృతం చేస్తాము:
  • ఇన్‌పుట్ ఫీల్డ్, ఎంపిక ఫీల్డ్ మరియు బటన్‌తో కూడిన ఉత్పత్తి కుటుంబం.
  • Windows మరియు macOS కోసం ఉత్పత్తి కుటుంబం యొక్క విభిన్న అమలులు.
  • మా ఉత్పత్తులను సృష్టించడం కోసం ఇంటర్‌ఫేస్‌ను నిర్వచించే వియుక్త ఫ్యాక్టరీ.
  • మా ఫ్యాక్టరీ యొక్క రెండు అమలులు, ప్రతి ఒక్కటి నిర్దిష్ట ఉత్పత్తుల కుటుంబాన్ని రూపొందించడానికి బాధ్యత వహిస్తాయి.
  • ఒక ఫారమ్ (జావా క్లాస్) ఫీల్డ్‌లు అబ్‌స్ట్రాక్ట్ ఇంటర్‌ఫేస్ ఎలిమెంట్‌లుగా ఉంటాయి, ఇవి అబ్‌స్ట్రాక్ట్ ఫ్యాక్టరీని ఉపయోగించి కన్స్ట్రక్టర్‌లో అవసరమైన విలువలతో ప్రారంభించబడతాయి.
  • అప్లికేషన్ క్లాస్ ఈ క్లాస్ లోపల, మేము ఒక ఫారమ్‌ను సృష్టిస్తాము, దాని కన్స్ట్రక్టర్‌కు కావలసిన ఫ్యాక్టరీ అమలును అందజేస్తాము.
ఫలితం ఏమిటంటే, మేము వియుక్త ఫ్యాక్టరీ నమూనాను అమలు చేసాము.

వియుక్త కర్మాగారం: ఎలా ఉపయోగించాలి

వియుక్త కర్మాగారం అనేది కాంక్రీట్ ఉత్పత్తి తరగతులతో ముడిపడి ఉండకుండా వివిధ ఉత్పత్తి కుటుంబాల సృష్టిని నిర్వహించడానికి డిజైన్ నమూనా. ఈ నమూనాను ఉపయోగిస్తున్నప్పుడు, మీరు తప్పక:
  1. ఉత్పత్తి కుటుంబాలను నిర్వచించండి. వాటిలో రెండు మనకు ఉన్నాయని అనుకుందాం:
    • SpecificProductA1,SpecificProductB1
    • SpecificProductA2,SpecificProductB2
  2. కుటుంబంలోని ప్రతి ఉత్పత్తికి, ఒక వియుక్త తరగతి (ఇంటర్‌ఫేస్) నిర్వచించండి. మా విషయంలో, మేము కలిగి ఉన్నాము:
    • ProductA
    • ProductB
  3. ప్రతి ఉత్పత్తి కుటుంబంలో, ప్రతి ఉత్పత్తి తప్పనిసరిగా దశ 2లో నిర్వచించిన ఇంటర్‌ఫేస్‌ను అమలు చేయాలి.
  4. దశ 2లో నిర్వచించబడిన ప్రతి ఉత్పత్తిని సృష్టించే పద్ధతులతో ఒక వియుక్త ఫ్యాక్టరీని సృష్టించండి. మా విషయంలో, ఈ పద్ధతులు ఇలా ఉంటాయి:
    • ProductA createProductA();
    • ProductB createProductB();
  5. నైరూప్య ఫ్యాక్టరీ అమలులను సృష్టించండి, తద్వారా ప్రతి అమలు ఒకే కుటుంబం యొక్క ఉత్పత్తుల సృష్టిని నియంత్రిస్తుంది. దీన్ని చేయడానికి, నైరూప్య కర్మాగారం యొక్క ప్రతి అమలులో, మీరు అన్ని క్రియేషన్స్ పద్ధతులను అమలు చేయాలి, తద్వారా అవి నిర్దిష్ట ఉత్పత్తి అమలులను సృష్టించి, తిరిగి ఇవ్వబడతాయి.
కింది UML రేఖాచిత్రం పైన పేర్కొన్న సూచనలను వివరిస్తుంది: డిజైన్ నమూనాలు: వియుక్త కర్మాగారం - 3ఇప్పుడు మేము ఈ సూచనల ప్రకారం కోడ్‌ను వ్రాస్తాము:

    // Define common product interfaces
    public interface ProductA {}
    public interface ProductB {}

    // Create various implementations (families) of our products
    public class SpecificProductA1 implements ProductA {}
    public class SpecificProductB1 implements ProductB {}

    public class SpecificProductA2 implements ProductA {}
    public class SpecificProductB2 implements ProductB {}

    // Create an abstract factory
    public interface AbstractFactory {
        ProductA createProductA();
        ProductB createProductB();
    }

    // Implement the abstract factory in order to create products in family 1
    public class SpecificFactory1 implements AbstractFactory {

        @Override
        public ProductA createProductA() {
            return new SpecificProductA1();
        }

        @Override
        public ProductB createProductB() {
            return new SpecificProductB1();
        }
    }

    // Implement the abstract factory in order to create products in family 2
    public class SpecificFactory2 implements AbstractFactory {

        @Override
        public ProductA createProductA() {
            return new SpecificProductA2();
        }

        @Override
        public ProductB createProductB() {
            return new SpecificProductB2();
        }
    }

ఇంటి పని

పదార్థాన్ని బలోపేతం చేయడానికి, మీరు 2 పనులను చేయవచ్చు:
  1. కాఫీ-ఆర్డరింగ్ అప్లికేషన్‌ను మెరుగుపరచండి, తద్వారా ఇది Linuxలో కూడా పని చేస్తుంది.
  2. ఏదైనా సైనిక వ్యూహంలో పాల్గొన్న యూనిట్లను ఉత్పత్తి చేయడానికి మీ స్వంత నైరూప్య కర్మాగారాన్ని సృష్టించండి. ఇది నిజమైన సైన్యాలతో కూడిన చారిత్రక సైనిక వ్యూహం కావచ్చు లేదా ఓర్క్స్, పిశాచములు మరియు దయ్యాలతో కూడిన ఫాంటసీ కావచ్చు. మీకు ఆసక్తి ఉన్నదాన్ని ఎంచుకోవడం ప్రధాన విషయం. సృజనాత్మకంగా ఉండండి, కన్సోల్‌లో సందేశాలను ముద్రించండి మరియు నమూనాల గురించి తెలుసుకోవడం ఆనందించండి!
వ్యాఖ్యలు
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION