স্থির কারখানার পদ্ধতিগুলি কী কী?


261

"স্ট্যাটিক কারখানা" পদ্ধতি কী?


বিকল্প স্ট্যাটিক কারখানার পদ্ধতিগুলি নির্ভরতা ইনজেকশন ব্যবহার করে।
সিএমসিডিগ্রাগনকাই

1
@ থাংফ্যাম জেসন ওভেনের উত্তর ত্রুটিযুক্ত কারণ এটি ফ্যাক্টরি পদ্ধতি প্যাটার্ন সম্পর্কে কথা বলার পরিকল্পনা করে, যা স্থির কারখানার পদ্ধতি প্যাটার্নের তুলনায় একেবারেই আলাদা যে এটি আসলে কথা বলে। সুতরাং, যদিও এটি প্রকৃত প্রশ্নের উত্তর দেওয়ার জন্য একটি ভাল কাজ করে, আমি মনে করি না এটি এটি বর্তমান অবস্থায় গ্রহণ করা যেতে পারে, কারণ এটি একটি সম্পর্কযুক্ত নিদর্শন এনে দেয় এবং দুটি প্যাটার্নের মধ্যে পার্থক্য সম্পর্কে ইতিমধ্যে অবিশ্বাস্যভাবে সাধারণ বিভ্রান্তি বাড়িয়ে তোলে।
থিওডোর মুরডক

@CMCDragonkai আমি মনে করি নির্ভরতা ইনজেকশন এবং স্ট্যাটিক কারখানা আলাদা। ইনজেকশনের জন্য নির্ভরতা ইনস্ট্যান্টিয়েটিংয়ের জন্য নির্ভরতা ইনজেকশনের ক্ষেত্রেও স্থির কারখানার প্রয়োজন হতে পারে।
করণ খান্না

উত্তর:


126

আমরা ডাটাবেস সংযোগগুলিতে সরাসরি অ্যাক্সেস সরবরাহ এড়াতে পারি কারণ তারা সংস্থাগুলি নিবিড়। সুতরাং আমরা একটি স্থিতিশীল কারখানা পদ্ধতি ব্যবহার getDbConnectionকরি যা সীমাবদ্ধতার নীচে থাকলে সংযোগ তৈরি করে। অন্যথায়, এটি একটি "অতিরিক্ত" সংযোগ সরবরাহ করার চেষ্টা করে, যদি কিছু না থাকে তবে ব্যতিক্রম ব্যর্থ হয়।

public class DbConnection{
   private static final int MAX_CONNS = 100;
   private static int totalConnections = 0;

   private static Set<DbConnection> availableConnections = new HashSet<DbConnection>();

   private DbConnection(){
     // ...
     totalConnections++;
   }

   public static DbConnection getDbConnection(){

     if(totalConnections < MAX_CONNS){
       return new DbConnection();

     }else if(availableConnections.size() > 0){
         DbConnection dbc = availableConnections.iterator().next();
         availableConnections.remove(dbc);
         return dbc;

     }else {
         throw new NoDbConnections();
     }
   }

   public static void returnDbConnection(DbConnection dbc){
     availableConnections.add(dbc);
     //...
   }
}

যদি আমি সঠিক বুঝতে পারি তবে আপনি কি পদ্ধতির রিটার্নবিডি সংযোগ (ডিবি সংযোগ ডিবি) এ উপলব্ধ সংযোগগুলি.ডড (ডিবি) যুক্ত করতে পারবেন?
হাইফেং ঝাং

@ হাইফজান, এটি আসলেই সম্পূর্ণ হওয়ার উদ্দেশ্যে নয়, তবে ঠিক আছে।
ম্যাথু ফ্ল্যাশেন

@ ম্যাথেজফ্ল্যাশনেও সংযোগ ফিরিয়ে দেওয়ার সময় মোট সংযোগগুলি হ্রাস করা উচিত?
রোলিং স্টোন

@ শ্রীধর, না, এটি সংযোগের সংখ্যাটি বিদ্যমান যা ট্র্যাক করা হয়েছে (যাতে বেশি পরিমাণে MAX_CONNS তৈরি না হয়), যে সংখ্যাটি প্রচলন করছে তা নয়।
ম্যাথু ফ্ল্যাশেন

@ ম্যাথেজফ্ল্যাশেন আপনার পদ্ধতিটি সোনারক्यूब দ্বারা ব্লকার-বাগ হিসাবে ধরা পড়বে যদি ডিবি সংযোগটি বন্ধ হয়।
আওয়ান বিরু

477

স্ট্যাটিক কারখানা পদ্ধতি প্যাটার্ন encapsulate বস্তুর সৃষ্টি করতে একটি উপায়। একটি কারখানা পদ্ধতি ছাড়া, আপনি কেবল ক্লাস কল করবে কন্সট্রাকটর সরাসরি: Foo x = new Foo()। এই প্যাটার্ন সঙ্গে, আপনি যদি এর পরিবর্তে কারখানা পদ্ধতি কল করবে: Foo x = Foo.create()। কনস্ট্রাক্টরগুলিকে ব্যক্তিগত হিসাবে চিহ্নিত করা হয়েছে, সুতরাং শ্রেণীর অভ্যন্তরীণ ব্যতীত তাদের কল করা যায় না, এবং কারখানার পদ্ধতিটি চিহ্নিত করা হয় staticযাতে কোনও বস্তু ছাড়াই এটি কল করা যায়।

এই প্যাটার্নটির কয়েকটি সুবিধা রয়েছে। একটি হ'ল কারখানাটি অনেকগুলি সাবক্লাস (বা একটি ইন্টারফেসের প্রয়োগকারী) থেকে চয়ন করতে পারে এবং তা ফিরিয়ে আনতে পারে। এইভাবে কলার কোনও সম্ভাব্য জটিল শ্রেণীর শ্রেণিবদ্ধতা না জেনে বা বুঝতে না পেরে প্যারামিটারগুলির মাধ্যমে পছন্দসই আচরণটি নির্দিষ্ট করতে পারে।

আরেকটি সুবিধা হ'ল ম্যাথু এবং জেমস যেমন উল্লেখ করেছেন, সংযোগের মতো সীমাবদ্ধ সংস্থার অ্যাক্সেসকে নিয়ন্ত্রণ করছে। পুনঃব্যবহারযোগ্য অবজেক্টের পুলগুলি প্রয়োগ করার উপায় - কোনও বস্তু নির্মাণ, ব্যবহার এবং ছিন্ন করার পরিবর্তে যদি নির্মাণ ও ধ্বংস ব্যয়বহুল প্রক্রিয়া হয় তবে এটি একবারে তৈরি করে পুনর্ব্যবহার করতে আরও বুদ্ধিমান হতে পারে। কারখানার পদ্ধতিটি বিদ্যমান, অব্যবহৃত তাত্ক্ষণিক অবজেক্টের যদি এটি থাকে তবে তা ফেরত দিতে পারে বা বস্তুর গণনাটি কিছুটা নীচের প্রান্তের নীচে থাকলে একটি নির্মাণ করতে পারে, বা একটি ব্যতিক্রম বা ফেরত দিতে পারেnull দিতে পারে উপরের প্রান্তিকের উপরে থাকলে পারে।

উইকিপিডিয়ায় নিবন্ধ অনুসারে, একাধিক কারখানার পদ্ধতিও অনুরূপ যুক্তির ধরণের বিভিন্ন ব্যাখ্যার অনুমতি দেয়। সাধারনত কনস্ট্রাক্টরের ক্লাসের মতোই নাম থাকে, যার অর্থ হল আপনি প্রদত্ত স্বাক্ষর সহ কেবলমাত্র একজন নির্মাতা থাকতে পারেন । কারখানাগুলি এতটা সীমাবদ্ধ নয়, যার অর্থ আপনার কাছে দুটি ভিন্ন পদ্ধতি থাকতে পারে যা একই যুক্তির ধরণগুলি গ্রহণ করে:

Coordinate c = Coordinate.createFromCartesian(double x, double y)

এবং

Coordinate c = Coordinate.createFromPolar(double distance, double angle)

এটি পাঠযোগ্যতা উন্নত করতে ব্যবহার করতে পারেন, যেমন রসাস নোট।


32
নোট করুন যে স্ট্যাটিক ফ্যাক্টরি পদ্ধতিটি ডিজাইন প্যাটার্নগুলি থেকে কারখানার পদ্ধতি প্যাটার্নের মতো নয় [গামা 95, পি। 107]। এই আইটেমটিতে বর্ণিত স্থিতিশীল কারখানার পদ্ধতির ডিজাইনের প্যাটার্নগুলিতে সরাসরি সমতুল্য নেই।
জোশ সানশাইন

এই উত্তরের জন্য আমার অর্থ প্রদানটি পোলযোগ্য বস্তুর উল্লেখ। এটি ঠিক কীভাবে আমি ফ্যাক্টরি পদ্ধতির প্যাটার্নটি ব্যবহার করছি। কারখানার পদ্ধতিগুলি কোনও অবজেক্টের জীবনচক্র নিয়ন্ত্রণ করতে সহায়তা করে: "তৈরি করুন" হয় পুল থেকে একটি বস্তু টেনে নিয়ে যায় বা পুলটি খালি থাকলে একটি নতুন উদাহরণ তৈরি করে, "ধ্বংস" ভবিষ্যতে পুনরায় ব্যবহারের জন্য এটি পুলটিতে ফিরিয়ে দেয়।
মিউট্যান্টেক্সেনু

2
আপনি এই পোস্টে যেখানেই "ফ্যাক্টরি পদ্ধতি প্যাটার্ন" বলছেন সেখানে সত্যই "স্ট্যাটিক ফ্যাক্টরি পদ্ধতি প্যাটার্ন" ব্যবহার করা উচিত, আপনি ভুল শব্দটি ব্যবহার করছেন। এছাড়াও, আপনি যে প্যাটার্নটির কথা বলছেন তার চেয়ে আলাদা আপনি উইকিপিডিয়া নিবন্ধের সাথে লিঙ্ক করছেন। কারখানার পদ্ধতি প্যাটার্নটিকে সম্ভবত "ফ্যাক্টরি ইন্টারফেস" প্যাটার্ন বলা উচিত ছিল, কারণ এতে একাধিক ফ্যাক্টরি অবজেক্ট ব্যবহার করা হয় যা একটি ফ্যাক্টরি ইন্টারফেস প্রয়োগ করে একটি একক অ্যালগরিদম উত্পাদন করতে সক্ষম করে পাশাপাশি কোনও ইন্টারফেসের উদাহরণ দিয়ে কাজ করে, কারখানার কোনও জিনিস গ্রহণ করে accepting যা নির্দিষ্ট কাঙ্ক্ষিত সাবক্লাস তৈরি করতে পারে।
থিওডোর মুরডক

8
আমি @ থিওডোরমুরডকের সাথে একমত আপনি ভুল শব্দটি ব্যবহার করছেন। আপনি যে বিষয়ে কথা বলছেন তা হ'ল জোশুয়া ব্লচের "স্ট্যাটিক ফ্যাক্টরি পদ্ধতি" তবে আপনি জিওএফের "কারখানার পদ্ধতি প্যাটার্ন" শব্দটি ব্যবহার করেন। অন্যদের ভুল বোঝাবুঝি না করার জন্য দয়া করে এটি সম্পাদনা করুন।
এমেরালডিউইউ

1
নোট করুন যে কনস্ট্রাক্টর ব্যক্তিগত হতে হবে না। একটি শ্রেণি উভয় পাবলিক স্ট্যাটিক কারখানার পদ্ধতি এবং নির্মাণকারী সরবরাহ করতে পারে।
কেভিন

171

বিঃদ্রঃ! " স্ট্যাটিক কারখানা পদ্ধতি হল না হিসাবে একই কারখানার পদ্ধতি প্যাটার্ন" (গ) কার্যকর জাভা, জশুয়া ব্লচ।

কারখানার পদ্ধতি: "কোনও অবজেক্ট তৈরির জন্য একটি ইন্টারফেস সংজ্ঞায়িত করুন, তবে ইন্টারফেস প্রয়োগকারী ক্লাসগুলি কোন শ্রেণিটি ইনস্ট্যান্ট করতে হবে তা সিদ্ধান্ত নিতে দিন The কারখানা পদ্ধতিটি একটি শ্রেণিকে উপক্লাসে ইনস্ট্যান্টেশনকে পিছিয়ে দেয়" (সি) জিওএফ।

"স্ট্যাটিক ফ্যাক্টরি পদ্ধতিটি একটি স্ট্যাটিক পদ্ধতি যা কোনও শ্রেণীর উদাহরণ দেয়" " (গ) কার্যকর জাভা, জোশুয়া ব্লচ। সাধারণত এই পদ্ধতিটি একটি নির্দিষ্ট শ্রেণীর ভিতরে থাকে।

পার্থক্য:

স্ট্যাটিক ফ্যাক্টরি পদ্ধতির মূল ধারণা হ'ল অবজেক্ট তৈরির উপর নিয়ন্ত্রণ অর্জন করা এবং এটি নির্মাণকারী থেকে স্থির পদ্ধতিতে অর্পণ করা। বস্তুর তৈরি করার সিদ্ধান্তটি পদ্ধতির বাইরে তৈরি অ্যাবস্ট্রাক্ট ফ্যাক্টরির মতো (সাধারণ ক্ষেত্রে, তবে সর্বদা নয়)। ফ্যাক্টরি পদ্ধতির কী (!) ধারণাটি কারখানার কোন পদ্ধতিতে কারখানার পদ্ধতি তৈরি করা উচিত সে সম্পর্কে সিদ্ধান্ত অর্পণ করা হয়। উদাহরণস্বরূপ ক্লাসিক একক বাস্তবায়ন স্থিতিশীল কারখানা পদ্ধতির একটি বিশেষ ক্ষেত্রে। সাধারণভাবে ব্যবহৃত স্থিতিশীল কারখানার পদ্ধতির উদাহরণ:

  • মান
  • getInstance
  • newInstance

আপনি কি নতুন এ () এবং এনেউইন্সট্যান্স () এর মধ্যে পার্থক্য বলতে পারবেন? এবং এ.এনইউইনস্ট্যান্সের ভিতরে আমাদের কী করা উচিত?
শেন

69

স্থিতিশীল কারখানার পদ্ধতি দ্বারা পাঠযোগ্যতা উন্নতি করা যেতে পারে:

তুলনা করা

public class Foo{
  public Foo(boolean withBar){
    //...
  }
}

//...

// What exactly does this mean?
Foo foo = new Foo(true);
// You have to lookup the documentation to be sure.
// Even if you remember that the boolean has something to do with a Bar
// you might not remember whether it specified withBar or withoutBar.

প্রতি

public class Foo{
  public static Foo createWithBar(){
    //...
  }

  public static Foo createWithoutBar(){
    //...
  }
}

// ...

// This is much easier to read!
Foo foo = Foo.createWithBar();

সুতরাং আমি আপনাকে উদাহরণ প্রয়োগ করার চেষ্টা করেছি তবে আমি নিশ্চিত নই যে এটি কীভাবে কাজ করে। আর এ দুটি পদ্ধতির ক্রু উইথবার এবং ক্রিয়েউইটবারকে ফু ক্লাসের ভিতরে 2 প্রাইভেট কনস্ট্রাক্টর কল করার কথা?
এসেসে

@ বাক্সটেক্স: হ্যাঁ প্রত্যেকে একটি প্রাইভেট কনস্ট্রাক্টর কল করবে। সম্ভবত কেবল private Foo(boolean withBar){/*..*/} public static Foo createWithBar(){return new Foo(true);} public static Foo createWithoutBar(){return new Foo(false);}
একইটি

আমি মনে করি এটি খুব ভাল "স্কেল" নয়। আপনার যদি তিন বা ততোধিক প্যারামিটার থাকে তবে আপনি কীভাবে এই ধারণাটি ব্যবহার করতে পারেন এবং পদ্ধতিটির জন্য একটি সুন্দর নাম তৈরি করতে পারেন?
ধেরিক

@ দেরিক: তারপরে আপনার সম্ভবত বিল্ডার প্যাটার্নটি ব্যবহার করা উচিত: নতুন FooBuilder () .বার () .বিহীন Foo () .বিজ () সাথে বিল্ড ();
রাসমুস ফ্যাবার

21
  • নামগুলি রয়েছে, কনস্ট্রাক্টরের বিপরীতে যা কোড স্পষ্ট করতে পারে।
  • প্রতিটি অনুরোধের ভিত্তিতে একটি নতুন অবজেক্ট তৈরি করার দরকার নেই - প্রয়োজনে বস্তুগুলি ক্যাশে এবং পুনরায় ব্যবহার করা যেতে পারে।
  • তাদের রিটার্নের ধরণের একটি উপ-প্রকারটি ফিরিয়ে আনতে পারে - বিশেষত, এমন কোনও বস্তু ফিরিয়ে দিতে পারে যার বাস্তবায়ন শ্রেণীর কলারের কাছে অজানা। এটি অনেকগুলি ফ্রেমওয়ার্কের একটি খুব মূল্যবান এবং বহুল ব্যবহৃত বৈশিষ্ট্য যা স্ট্যাটিক কারখানার পদ্ধতিগুলির রিটার্ন ধরণের হিসাবে ইন্টারফেস ব্যবহার করে।

থেকেhttp://www.javapractices.com/topic/TopicAction.do?Id=21


18

এটি সবই রক্ষণাবেক্ষণে ফোটে। এটিকে রাখার সর্বোত্তম উপায় হ'ল যখনই আপনি কোনও newশব্দ তৈরি করতে কীওয়ার্ডটি ব্যবহার করেন , আপনি যে কোডটি প্রয়োগ করছেন তার সাথে আপনি সংযুক্ত করছেন।

কারখানার প্যাটার্নটি আপনাকে কীভাবে কোনও অবজেক্ট তৈরি করবে আপনি সেই বস্তুর সাথে কী করবেন তা থেকে আলাদা করতে দেয়। আপনি যখন কন্সট্রাক্টরগুলি ব্যবহার করে আপনার সমস্ত অবজেক্ট তৈরি করেন, আপনি মূলত সেই কোডটি হার্ড-ওয়্যারিং করেন যা সেই প্রয়োগের জন্য অবজেক্টটি ব্যবহার করে। আপনার বস্তুটি ব্যবহার করে এমন কোডটি সেই বস্তুর "উপর নির্ভরশীল"। এটি পৃষ্ঠতলে কোনও বড় চুক্তির মতো নাও মনে হতে পারে তবে যখন বস্তুটি পরিবর্তিত হবে (কনস্ট্রাক্টরের স্বাক্ষর পরিবর্তন করার বিষয়ে, বা বস্তুকে সাবক্লাসিংয়ের কথা ভাবেন) আপনাকে ফিরে যেতে হবে এবং সর্বত্র জিনিসগুলি পুনর্নির্মাণ করতে হবে।

আজ কারখানাগুলি নির্ভরশীল ইনজেকশন ব্যবহারের পক্ষে বেশিরভাগ দিকে একসাথে ব্রাশ করা হয়েছে কারণ তাদের প্রচুর বয়লার-প্লেট কোডের প্রয়োজন যা নিজের বজায় রাখতে কিছুটা শক্ত হয়ে যায়। নির্ভরতা ইনজেকশন মূলত কারখানার সমতুল্য তবে আপনাকে কীভাবে আপনার অবজেক্টগুলি একসাথে ঘোষিতভাবে ঘোষণা করা যায় (কনফিগারেশন বা টীকাগুলির মাধ্যমে) তা নির্দিষ্ট করতে দেয়।


3
আপনি কি বলছেন যে কারখানাগুলিকে একটি বেলআউট দরকার? ;)
জন Farrell

4
হা হা! এই দিন এবং যুগে আমি মনে করি আমরা সকলেই একটি বেলআউট ব্যবহার করতে পারি ... :)
cwash

11

কোনও শ্রেণীর নির্মাতা যদি ব্যক্তিগত হয় তবে আপনি এর বাইরে থেকে ক্লাসের জন্য কোনও বিষয় তৈরি করতে পারবেন না।

class Test{
 int x, y;
 private Test(){
  .......
  .......
  }
}

আমরা এর বাইরে থেকে উপরের শ্রেণীর জন্য কোনও বস্তু তৈরি করতে পারি না। সুতরাং আপনি ক্লাসের বাইরে থেকে এক্স, ওয়াই প্রবেশ করতে পারবেন না। তাহলে এই শ্রেণীর ব্যবহার কী?
এখানে উত্তর: ফ্যাক্টরি পদ্ধতি।
উপরের ক্লাসে নীচের পদ্ধতিটি যুক্ত করুন

public static Test getObject(){
  return new Test();
}

সুতরাং এখন আপনি এটির বাইরে থেকে এই শ্রেণীর জন্য একটি বিষয় তৈরি করতে পারেন। পথ মত...

Test t = Test.getObject();

সুতরাং, একটি স্থিতিশীল পদ্ধতি যা তার প্রাইভেট কনস্ট্রাক্টর সম্পাদন করে শ্রেণীর অবজেক্টকে ফিরিয়ে দেয় তাকে ফ্যাক্টরি পদ্ধতি বলে


1
কেন আপনি এটিকে "সমাধান" বলছেন? একটি প্রাইভেট কনস্ট্রাক্টর ঘোষণা করা কোনও "সমস্যা" নয়, এটি একটি নকশার ধরণ।
ওজনুগা জুড ওচালিফু

1
আপডেট করা হয়েছে। যাইহোক ধন্যবাদ
সান্থোষ

হাই @ সন্তোষ আমার সম্পর্কে উদ্বিগ্ন হ'ল আপনি ব্যক্তিগত নির্মাতাটিকে সর্বজনীন হতে দেন না কেন? আপনি যদি সাবক্লাস তৈরি করতে না চান তবে এটি আমার পক্ষে ভাল, তবে যদি আমি ব্যক্তিগত নির্মাতা তৈরির পরিকল্পনা না করি তবে Static Factory Methodপাবলিক কনস্ট্রাক্টরের উপর আমাদের কোনও সুবিধা আছে কি ?
শেন

9

আমি ভেবেছিলাম আমি কী জানি আমি এই পোস্টে কিছুটা আলো যুক্ত করব। আমরা আমাদের এই কৌশলটি ব্যাপকভাবে ব্যবহার করেছি recent android project। পরিবর্তে creating objects using new operatorআপনি static methodএকটি বর্গ ইনস্ট্যান্ট করতে ব্যবহার করতে পারেন । কোড তালিকা:

//instantiating a class using constructor
Vinoth vin = new Vinoth(); 

//instantiating the class using static method
Class Vinoth{
  private Vinoth(){
  }
  // factory method to instantiate the class
  public static Vinoth getInstance(){
    if(someCondition)
        return new Vinoth();
  }
}

স্থিতিশীল পদ্ধতি শর্তসাপেক্ষ বস্তু তৈরিতে সমর্থন করে : প্রতিবার আপনি কোনও নির্মাণকারীর আবেদন করলে একটি বস্তু তৈরি হয়ে যায় তবে আপনি এটি চান না। মনে করুন আপনি কেবল কোনও শর্ত পরীক্ষা করতে চান তবেই আপনি একটি নতুন অবজেক্ট তৈরি করতে চান your আপনি নিজের অবস্থাতেই সন্তুষ্ট না হলে আপনি প্রতিবার বিনোথের একটি নতুন উদাহরণ তৈরি করবেন না।

কার্যকর জাভা থেকে নেওয়া অন্য একটি উদাহরণ ।

public static Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);
}

এই পদ্ধতিটি একটি বুলিয়ান আদিম মানকে বুলিয়ান অবজেক্ট রেফারেন্সে অনুবাদ করে। Boolean.valueOf(boolean)পদ্ধতি আমাদের প্রকাশ, এটা একটি বস্তু কখনই সৃষ্টি করে। static factory methodsপুনরাবৃত্তি থেকে একই জিনিসটি ফেরত দেওয়ার ক্ষমতা invocationsশ্রেণিগুলিকে যে কোনও সময়ে যে কোন পরিস্থিতিতে উপস্থিত রয়েছে তার উপর কঠোর নিয়ন্ত্রণ বজায় রাখতে দেয়।

Static factory methodsএটি কি ভিন্ন constructors, তারা তাদের যে objectকোনও subtypeরিটার্ন টাইপ ফেরত দিতে পারে। এই নমনীয়তার একটি অ্যাপ্লিকেশন হ'ল কোনও এপিআই তাদের ক্লাসগুলি সর্বজনীন না করে অবজেক্টগুলি ফিরিয়ে দিতে পারে। এই ফ্যাশনে বাস্তবায়ন ক্লাসগুলি লুকিয়ে রাখার ফলে খুব কমপ্যাক্ট এপিআই হয়।

Calendar.getInstance () এটা লোকেল একটি উপর নির্ভর করে সৃষ্টি, উপরে জন্য একটি বড় উদাহরণ BuddhistCalendar, JapaneseImperialCalendarঅথবা ডিফল্ট একের পর Georgian

অন্য একটি উদাহরণ যা আমি ভাবতে পারি তা হ'ল Singleton pattern, যেখানে আপনি নিজের getInstanceনির্মাতাদের ব্যক্তিগত করে সেখানে একটি নিজস্ব পদ্ধতি তৈরি করেন যেখানে আপনি নিশ্চিত হন যে এখানে সবসময় কেবলমাত্র একটি উদাহরণ উপস্থিত থাকে।

public class Singleton{
    //initailzed during class loading
    private static final Singleton INSTANCE = new Singleton();

    //to prevent creating another instance of Singleton
    private Singleton(){}

    public static Singleton getSingleton(){
        return INSTANCE;
    }
}

4

একটি কারখানার পদ্ধতি এমন একটি পদ্ধতি যা কোনও বস্তুর তাত্পর্যকে বিমূর্ত করে। সাধারণত কারখানাগুলি কার্যকর হয় যখন আপনি জানেন যে আপনার এমন কোনও শ্রেণির একটি নতুন উদাহরণ প্রয়োজন যা কিছু ইন্টারফেস প্রয়োগ করে তবে আপনি বাস্তবায়নকারী শ্রেণিটি জানেন না।

সম্পর্কিত ক্লাসের শ্রেণিবিন্যাসের সাথে কাজ করার সময় এটি দরকারী, এটির একটি ভাল উদাহরণ একটি জিইউআই টুলকিট হবে। প্রতিটি উইজেটের কংক্রিট বাস্তবায়নের জন্য আপনি কেবল কন্সট্রাক্টরদের কাছে হার্ড-কোড কল করতে পারতেন তবে আপনি যদি কখনও অন্যটির জন্য একটি সরঞ্জামকিট পরিবর্তন করতে চান তবে আপনার অনেকগুলি স্থান পরিবর্তন করতে হবে। একটি কারখানা ব্যবহার করে আপনি কোডের পরিমাণ হ্রাস করতে পারেন যা আপনাকে পরিবর্তন করতে হবে।


আপনার কারখানাটি একটি ইন্টারফেস প্রকার ফেরত পাঠিয়েছে এবং আপনি যে কংক্রিটের সাথে কাজ করছেন তা নয় ing
বিল লিঞ্চ

1
এই উত্তরটি কারখানার পদ্ধতি নকশার প্যাটার্ন সম্পর্কে স্থির কারখানা পদ্ধতি নয়। একটি স্থিতিশীল কারখানার পদ্ধতিগুলি কেবল একটি সর্বজনীন স্ট্যাটিক পদ্ধতি যা কোনও শ্রেণীর উদাহরণ দেয়। আরও বিশদের জন্য কার্যকর জাভার দ্বিতীয় অধ্যায়টি দেখুন।
জোশ রোদ

4

স্ট্যাটিক ফ্যাক্টরি থেকে প্রাপ্ত সুবিধার মধ্যে একটি হ'ল এপিআই তাদের ক্লাসগুলি সর্বজনীন না করে অবজেক্টগুলি ফিরিয়ে দিতে পারে। এটি খুব কমপ্যাক্ট API তে নেতৃত্ব দেয়। জাভাতে এটি সংগ্রহের ক্লাস দ্বারা প্রাপ্ত হয় যা প্রায় 32 টি ক্লাস লুকায় যা এটি এপিআইকে খুব কমপ্যাক্ট করে তোলে।


2

একটি স্থিতিশীল কারখানার পদ্ধতি ভাল যখন আপনি নিশ্চিত করতে চান যে কেবলমাত্র একটি একক উদাহরণ ব্যবহার করার জন্য কংক্রিটের ক্লাসটি ফিরিয়ে দিচ্ছে।

উদাহরণস্বরূপ, একটি ডাটাবেস সংযোগ শ্রেণিতে, আপনি কেবল একটি ক্লাসে ডাটাবেস সংযোগ তৈরি করতে চাইতে পারেন, যাতে আপনি যদি মাইএসকিএল থেকে ওরাকলে স্যুইচ করার সিদ্ধান্ত নেন তবে আপনি কেবল একটি শ্রেণিতে যুক্তি পরিবর্তন করতে পারবেন, এবং বাকী অ্যাপ্লিকেশনটি নতুন সংযোগ ব্যবহার করুন।

আপনি যদি ডাটাবেস পুলিং বাস্তবায়ন করতে চান, তবে এটি অ্যাপ্লিকেশনটির বাকী অংশগুলিকে প্রভাবিত না করেও করা হবে।

এটি কারখানায় আপনি যে পরিবর্তন করতে পারেন তার থেকে বাকি অ্যাপ্লিকেশনটিকে সুরক্ষা দেয়, এটিই উদ্দেশ্য।

এটি স্থিতিশীল হওয়ার কারণ হ'ল যদি আপনি কিছু সীমাবদ্ধ সংস্থান (সকেট সংযোগ বা ফাইল হ্যান্ডলগুলির সংখ্যা) ট্র্যাক রাখতে চান তবে এই শ্রেণিটি কতজন পাস করেছে এবং ফিরে এসেছে তার উপর নজর রাখতে পারে, তাই আপনি এটিকে ক্লান্ত করবেন না সীমিত সংস্থান


2

প্রাইভেট কনস্ট্রাক্টর সহ স্থির কারখানার পদ্ধতির একটি সুবিধা (বাহ্যিক শ্রেণীর জন্য উদাহরণগুলি বাহ্যিকভাবে তৈরি না হয় তা নিশ্চিত করার জন্য অবজেক্ট তৈরি অবশ্যই সীমাবদ্ধ করা উচিত) হ'ল আপনি উদাহরণ-নিয়ন্ত্রিত ক্লাস তৈরি করতে পারেন । এবং উদাহরণস্বরূপ-নিয়ন্ত্রিত শ্রেণিগুলি গ্যারান্টি দেয় যে কোনও দুটি সমান স্বতন্ত্র দৃষ্টান্ত উপস্থিত নেই (উদাহরণস্বরূপ (খ) যদি এবং শুধুমাত্র যদি একটি == খ ) আপনার প্রোগ্রাম চলমান থাকে তবে আপনি সমান পদ্ধতির পরিবর্তে == অপারেটরের সাথে বস্তুর সমতা পরীক্ষা করতে পারবেন কার্যকর জাভা অনুযায়ী।

পুনরাবৃত্তির অনুরোধগুলি থেকে একই জিনিসটিকে ফিরিয়ে আনতে স্থিতিশীল কারখানার পদ্ধতির দক্ষতা ক্লাসগুলিকে যে কোনও সময়ে কোন পরিস্থিতিতে উপস্থিত রয়েছে তার উপর কঠোর নিয়ন্ত্রণ বজায় রাখতে দেয়। এটি করা ক্লাসগুলি উদাহরণ-নিয়ন্ত্রিত বলে বলা হয়। উদাহরণ-নিয়ন্ত্রিত ক্লাস লেখার বেশ কয়েকটি কারণ রয়েছে। ইনস্ট্যান্স নিয়ন্ত্রণ কোনও শ্রেণিকে গ্যারান্টি দেওয়ার অনুমতি দেয় যে এটি একটি সিঙ্গলটন (আইটেম 3) বা অবিচ্ছিন্ন (আইটেম 4)। এছাড়াও, এটি একটি অপরিবর্তনীয় শ্রেণিকে (আইটেম 15) গ্যারান্টি তৈরি করতে অনুমতি দেয় যে দুটি সমান দৃষ্টান্ত উপস্থিত নেই: a.equals (খ) যদি এবং কেবল যদি a == খ হয়। যদি কোনও শ্রেণি এই গ্যারান্টিটি তৈরি করে তবে তার ক্লায়েন্টরা সমতুল্য (অবজেক্ট) পদ্ধতির পরিবর্তে == অপারেটরটি ব্যবহার করতে পারে, যার ফলে উন্নত কর্মক্ষমতা দেখা দিতে পারে। এনাম ধরণের (আইটেম 30) এই গ্যারান্টি সরবরাহ করে।

কার্যকর জাভা থেকে, জোশুয়া ব্লচ (আইটেম 1, পৃষ্ঠা 6)


1

স্থির

সদস্য 'স্ট্যাটিক' কীওয়ার্ড সহ ঘোষণা করলেন।

কারখানা পদ্ধতি

এমন পদ্ধতি যা নতুন অবজেক্ট তৈরি করে এবং ফেরত দেয়।

জাভাতে

প্রোগ্রামিং ভাষা 'স্ট্যাটিক' অর্থের সাথে প্রাসঙ্গিক তবে 'কারখানার' সংজ্ঞা অনুসারে নয় definition


@ ভিক্টর প্রতিক্রিয়াগুলিতে যুক্তি থাকতে হবে না। তথ্যগুলি পর্যাপ্ত পরিমাণে হওয়া উচিত: যদি বিতর্কিত হয় তবে সেগুলি যুক্তি বা উদ্ধৃতি দ্বারা সমর্থন করা যেতে পারে। আমি জানি না যে এখানে বিতর্কিত কিছু আছে।
লার্নের মারকুইস

আমি বলেছিলাম যে উত্তরটি খুব সংক্ষিপ্ত ছিল এবং প্রথম, দ্বিতীয় এবং তৃতীয় বর্ণনটি সত্যই ভালভাবে বুঝতে পারে নি, যাইহোক, পুনরায় জিজ্ঞাসা করার জন্য ওপির উপর নির্ভর করে। কিছু মনে করি না, আমি আমার মন পরিবর্তন করেছি এবং ডাউনভোটটি সরিয়ে দেওয়ার চেষ্টা করেছি, তবে আমি পারছি না।
ভিক্টর

@ ভিক্টর সংজ্ঞাটি 'খুব সংক্ষিপ্ত'। কখনও কখনও আসল উত্তরটি কেবল 'হ্যাঁ', 'না', 'না', বা 'উভয়ই'। 'খুব সংক্ষিপ্ত' সম্পূর্ণ বিষয়গত j আমি এখনও আপনার মূল মন্তব্য বুঝতে পারি না। সংজ্ঞাগুলি সমর্থন করার জন্য আপনার পক্ষে যুক্তিগুলির প্রয়োজন নেই। সংজ্ঞানুসারে. আমি আমার উত্তরটি সম্পাদনা করেছি তাই এখন ডাউনভোটটি সরানো সম্ভব হবে।
মার্কিনিউ লর্নে

অবশ্যই সাবজেক্টিভ ... সমস্ত স্ট্যাকওভারফ্লো উত্তর সাবজেক্টিভ, বাস্তবে এগুলি লেখক স্তরের জ্ঞানের সাথে সম্পর্কিত এবং উত্তর দেওয়ার ইচ্ছার সাথে সম্পর্কিত। আমি আপনার উত্তরটি সত্যিই বুঝতে পারি না, সম্ভবত এটি সংক্ষেপে ছিল।
ভিক্টর

@ উইকটার আবর্জনা বিষয়গুলির বিষয়গুলি বিষয়গত নয় এবং তাত্পর্যপূর্ণ বিষয় বা বিষয়াদি থেকে উদ্ভূতভাবে উদ্ভূত হতে পারে এমন বিষয়ও নয়। অন্যদিকে 'খুব সংক্ষিপ্ত' বিষয়গত এবং আমি ইতিমধ্যে এটি সম্বোধন করেছি। এই উত্তরটি মূলত হিসাবে একই এই এক , যা আপনি মন্তব্য করেছেন করেন নি। আপনার মন্তব্যগুলি অস্পষ্ট রয়ে গেছে।
লার্নের মারকুইস

1

জাভা বাস্তবায়নে java.util.Arrays এবং java.util. সংগ্রহ উভয়টি ব্যবহারের ক্লাব রয়েছে, উভয়ই স্থিতিশীল কারখানার পদ্ধতি , এর উদাহরণ এবং কীভাবে ব্যবহার করবেন:

  • Arrays.asList("1","2","3")

  • Collections.synchronizedList(..), Collections.emptyList(), Collections.unmodifiableList(...) (শুধুমাত্র কিছু উদাহরণ, mor লেহন পদ্ধতি উদাহরণের জন্য javadocs পরীক্ষা পারে https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html )

এছাড়াও java.lang. স্ট্রিং ক্লাসে এই জাতীয় স্থির কারখানার পদ্ধতি রয়েছে :

  • String.format(...), String.valueOf(..), String.copyValueOf(...)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.