"স্ট্যাটিক কারখানা" পদ্ধতি কী?
"স্ট্যাটিক কারখানা" পদ্ধতি কী?
উত্তর:
আমরা ডাটাবেস সংযোগগুলিতে সরাসরি অ্যাক্সেস সরবরাহ এড়াতে পারি কারণ তারা সংস্থাগুলি নিবিড়। সুতরাং আমরা একটি স্থিতিশীল কারখানা পদ্ধতি ব্যবহার 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);
//...
}
}
স্ট্যাটিক কারখানা পদ্ধতি প্যাটার্ন 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)
এটি পাঠযোগ্যতা উন্নত করতে ব্যবহার করতে পারেন, যেমন রসাস নোট।
বিঃদ্রঃ! " স্ট্যাটিক কারখানা পদ্ধতি হল না হিসাবে একই কারখানার পদ্ধতি প্যাটার্ন" (গ) কার্যকর জাভা, জশুয়া ব্লচ।
কারখানার পদ্ধতি: "কোনও অবজেক্ট তৈরির জন্য একটি ইন্টারফেস সংজ্ঞায়িত করুন, তবে ইন্টারফেস প্রয়োগকারী ক্লাসগুলি কোন শ্রেণিটি ইনস্ট্যান্ট করতে হবে তা সিদ্ধান্ত নিতে দিন The কারখানা পদ্ধতিটি একটি শ্রেণিকে উপক্লাসে ইনস্ট্যান্টেশনকে পিছিয়ে দেয়" (সি) জিওএফ।
"স্ট্যাটিক ফ্যাক্টরি পদ্ধতিটি একটি স্ট্যাটিক পদ্ধতি যা কোনও শ্রেণীর উদাহরণ দেয়" " (গ) কার্যকর জাভা, জোশুয়া ব্লচ। সাধারণত এই পদ্ধতিটি একটি নির্দিষ্ট শ্রেণীর ভিতরে থাকে।
পার্থক্য:
স্ট্যাটিক ফ্যাক্টরি পদ্ধতির মূল ধারণা হ'ল অবজেক্ট তৈরির উপর নিয়ন্ত্রণ অর্জন করা এবং এটি নির্মাণকারী থেকে স্থির পদ্ধতিতে অর্পণ করা। বস্তুর তৈরি করার সিদ্ধান্তটি পদ্ধতির বাইরে তৈরি অ্যাবস্ট্রাক্ট ফ্যাক্টরির মতো (সাধারণ ক্ষেত্রে, তবে সর্বদা নয়)। ফ্যাক্টরি পদ্ধতির কী (!) ধারণাটি কারখানার কোন পদ্ধতিতে কারখানার পদ্ধতি তৈরি করা উচিত সে সম্পর্কে সিদ্ধান্ত অর্পণ করা হয়। উদাহরণস্বরূপ ক্লাসিক একক বাস্তবায়ন স্থিতিশীল কারখানা পদ্ধতির একটি বিশেষ ক্ষেত্রে। সাধারণভাবে ব্যবহৃত স্থিতিশীল কারখানার পদ্ধতির উদাহরণ:
স্থিতিশীল কারখানার পদ্ধতি দ্বারা পাঠযোগ্যতা উন্নতি করা যেতে পারে:
তুলনা করা
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();
private Foo(boolean withBar){/*..*/}
public static Foo createWithBar(){return new Foo(true);}
public static Foo createWithoutBar(){return new Foo(false);}
- নামগুলি রয়েছে, কনস্ট্রাক্টরের বিপরীতে যা কোড স্পষ্ট করতে পারে।
- প্রতিটি অনুরোধের ভিত্তিতে একটি নতুন অবজেক্ট তৈরি করার দরকার নেই - প্রয়োজনে বস্তুগুলি ক্যাশে এবং পুনরায় ব্যবহার করা যেতে পারে।
- তাদের রিটার্নের ধরণের একটি উপ-প্রকারটি ফিরিয়ে আনতে পারে - বিশেষত, এমন কোনও বস্তু ফিরিয়ে দিতে পারে যার বাস্তবায়ন শ্রেণীর কলারের কাছে অজানা। এটি অনেকগুলি ফ্রেমওয়ার্কের একটি খুব মূল্যবান এবং বহুল ব্যবহৃত বৈশিষ্ট্য যা স্ট্যাটিক কারখানার পদ্ধতিগুলির রিটার্ন ধরণের হিসাবে ইন্টারফেস ব্যবহার করে।
এটি সবই রক্ষণাবেক্ষণে ফোটে। এটিকে রাখার সর্বোত্তম উপায় হ'ল যখনই আপনি কোনও new
শব্দ তৈরি করতে কীওয়ার্ডটি ব্যবহার করেন , আপনি যে কোডটি প্রয়োগ করছেন তার সাথে আপনি সংযুক্ত করছেন।
কারখানার প্যাটার্নটি আপনাকে কীভাবে কোনও অবজেক্ট তৈরি করবে আপনি সেই বস্তুর সাথে কী করবেন তা থেকে আলাদা করতে দেয়। আপনি যখন কন্সট্রাক্টরগুলি ব্যবহার করে আপনার সমস্ত অবজেক্ট তৈরি করেন, আপনি মূলত সেই কোডটি হার্ড-ওয়্যারিং করেন যা সেই প্রয়োগের জন্য অবজেক্টটি ব্যবহার করে। আপনার বস্তুটি ব্যবহার করে এমন কোডটি সেই বস্তুর "উপর নির্ভরশীল"। এটি পৃষ্ঠতলে কোনও বড় চুক্তির মতো নাও মনে হতে পারে তবে যখন বস্তুটি পরিবর্তিত হবে (কনস্ট্রাক্টরের স্বাক্ষর পরিবর্তন করার বিষয়ে, বা বস্তুকে সাবক্লাসিংয়ের কথা ভাবেন) আপনাকে ফিরে যেতে হবে এবং সর্বত্র জিনিসগুলি পুনর্নির্মাণ করতে হবে।
আজ কারখানাগুলি নির্ভরশীল ইনজেকশন ব্যবহারের পক্ষে বেশিরভাগ দিকে একসাথে ব্রাশ করা হয়েছে কারণ তাদের প্রচুর বয়লার-প্লেট কোডের প্রয়োজন যা নিজের বজায় রাখতে কিছুটা শক্ত হয়ে যায়। নির্ভরতা ইনজেকশন মূলত কারখানার সমতুল্য তবে আপনাকে কীভাবে আপনার অবজেক্টগুলি একসাথে ঘোষিতভাবে ঘোষণা করা যায় (কনফিগারেশন বা টীকাগুলির মাধ্যমে) তা নির্দিষ্ট করতে দেয়।
কোনও শ্রেণীর নির্মাতা যদি ব্যক্তিগত হয় তবে আপনি এর বাইরে থেকে ক্লাসের জন্য কোনও বিষয় তৈরি করতে পারবেন না।
class Test{
int x, y;
private Test(){
.......
.......
}
}
আমরা এর বাইরে থেকে উপরের শ্রেণীর জন্য কোনও বস্তু তৈরি করতে পারি না। সুতরাং আপনি ক্লাসের বাইরে থেকে এক্স, ওয়াই প্রবেশ করতে পারবেন না। তাহলে এই শ্রেণীর ব্যবহার কী?
এখানে উত্তর: ফ্যাক্টরি পদ্ধতি।
উপরের ক্লাসে নীচের পদ্ধতিটি যুক্ত করুন
public static Test getObject(){
return new Test();
}
সুতরাং এখন আপনি এটির বাইরে থেকে এই শ্রেণীর জন্য একটি বিষয় তৈরি করতে পারেন। পথ মত...
Test t = Test.getObject();
সুতরাং, একটি স্থিতিশীল পদ্ধতি যা তার প্রাইভেট কনস্ট্রাক্টর সম্পাদন করে শ্রেণীর অবজেক্টকে ফিরিয়ে দেয় তাকে ফ্যাক্টরি পদ্ধতি বলে
।
Static Factory Method
পাবলিক কনস্ট্রাক্টরের উপর আমাদের কোনও সুবিধা আছে কি ?
আমি ভেবেছিলাম আমি কী জানি আমি এই পোস্টে কিছুটা আলো যুক্ত করব। আমরা আমাদের এই কৌশলটি ব্যাপকভাবে ব্যবহার করেছি 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;
}
}
একটি কারখানার পদ্ধতি এমন একটি পদ্ধতি যা কোনও বস্তুর তাত্পর্যকে বিমূর্ত করে। সাধারণত কারখানাগুলি কার্যকর হয় যখন আপনি জানেন যে আপনার এমন কোনও শ্রেণির একটি নতুন উদাহরণ প্রয়োজন যা কিছু ইন্টারফেস প্রয়োগ করে তবে আপনি বাস্তবায়নকারী শ্রেণিটি জানেন না।
সম্পর্কিত ক্লাসের শ্রেণিবিন্যাসের সাথে কাজ করার সময় এটি দরকারী, এটির একটি ভাল উদাহরণ একটি জিইউআই টুলকিট হবে। প্রতিটি উইজেটের কংক্রিট বাস্তবায়নের জন্য আপনি কেবল কন্সট্রাক্টরদের কাছে হার্ড-কোড কল করতে পারতেন তবে আপনি যদি কখনও অন্যটির জন্য একটি সরঞ্জামকিট পরিবর্তন করতে চান তবে আপনার অনেকগুলি স্থান পরিবর্তন করতে হবে। একটি কারখানা ব্যবহার করে আপনি কোডের পরিমাণ হ্রাস করতে পারেন যা আপনাকে পরিবর্তন করতে হবে।
স্ট্যাটিক ফ্যাক্টরি থেকে প্রাপ্ত সুবিধার মধ্যে একটি হ'ল এপিআই তাদের ক্লাসগুলি সর্বজনীন না করে অবজেক্টগুলি ফিরিয়ে দিতে পারে। এটি খুব কমপ্যাক্ট API তে নেতৃত্ব দেয়। জাভাতে এটি সংগ্রহের ক্লাস দ্বারা প্রাপ্ত হয় যা প্রায় 32 টি ক্লাস লুকায় যা এটি এপিআইকে খুব কমপ্যাক্ট করে তোলে।
একটি স্থিতিশীল কারখানার পদ্ধতি ভাল যখন আপনি নিশ্চিত করতে চান যে কেবলমাত্র একটি একক উদাহরণ ব্যবহার করার জন্য কংক্রিটের ক্লাসটি ফিরিয়ে দিচ্ছে।
উদাহরণস্বরূপ, একটি ডাটাবেস সংযোগ শ্রেণিতে, আপনি কেবল একটি ক্লাসে ডাটাবেস সংযোগ তৈরি করতে চাইতে পারেন, যাতে আপনি যদি মাইএসকিএল থেকে ওরাকলে স্যুইচ করার সিদ্ধান্ত নেন তবে আপনি কেবল একটি শ্রেণিতে যুক্তি পরিবর্তন করতে পারবেন, এবং বাকী অ্যাপ্লিকেশনটি নতুন সংযোগ ব্যবহার করুন।
আপনি যদি ডাটাবেস পুলিং বাস্তবায়ন করতে চান, তবে এটি অ্যাপ্লিকেশনটির বাকী অংশগুলিকে প্রভাবিত না করেও করা হবে।
এটি কারখানায় আপনি যে পরিবর্তন করতে পারেন তার থেকে বাকি অ্যাপ্লিকেশনটিকে সুরক্ষা দেয়, এটিই উদ্দেশ্য।
এটি স্থিতিশীল হওয়ার কারণ হ'ল যদি আপনি কিছু সীমাবদ্ধ সংস্থান (সকেট সংযোগ বা ফাইল হ্যান্ডলগুলির সংখ্যা) ট্র্যাক রাখতে চান তবে এই শ্রেণিটি কতজন পাস করেছে এবং ফিরে এসেছে তার উপর নজর রাখতে পারে, তাই আপনি এটিকে ক্লান্ত করবেন না সীমিত সংস্থান
প্রাইভেট কনস্ট্রাক্টর সহ স্থির কারখানার পদ্ধতির একটি সুবিধা (বাহ্যিক শ্রেণীর জন্য উদাহরণগুলি বাহ্যিকভাবে তৈরি না হয় তা নিশ্চিত করার জন্য অবজেক্ট তৈরি অবশ্যই সীমাবদ্ধ করা উচিত) হ'ল আপনি উদাহরণ-নিয়ন্ত্রিত ক্লাস তৈরি করতে পারেন । এবং উদাহরণস্বরূপ-নিয়ন্ত্রিত শ্রেণিগুলি গ্যারান্টি দেয় যে কোনও দুটি সমান স্বতন্ত্র দৃষ্টান্ত উপস্থিত নেই (উদাহরণস্বরূপ (খ) যদি এবং শুধুমাত্র যদি একটি == খ ) আপনার প্রোগ্রাম চলমান থাকে তবে আপনি সমান পদ্ধতির পরিবর্তে == অপারেটরের সাথে বস্তুর সমতা পরীক্ষা করতে পারবেন কার্যকর জাভা অনুযায়ী।
পুনরাবৃত্তির অনুরোধগুলি থেকে একই জিনিসটিকে ফিরিয়ে আনতে স্থিতিশীল কারখানার পদ্ধতির দক্ষতা ক্লাসগুলিকে যে কোনও সময়ে কোন পরিস্থিতিতে উপস্থিত রয়েছে তার উপর কঠোর নিয়ন্ত্রণ বজায় রাখতে দেয়। এটি করা ক্লাসগুলি উদাহরণ-নিয়ন্ত্রিত বলে বলা হয়। উদাহরণ-নিয়ন্ত্রিত ক্লাস লেখার বেশ কয়েকটি কারণ রয়েছে। ইনস্ট্যান্স নিয়ন্ত্রণ কোনও শ্রেণিকে গ্যারান্টি দেওয়ার অনুমতি দেয় যে এটি একটি সিঙ্গলটন (আইটেম 3) বা অবিচ্ছিন্ন (আইটেম 4)। এছাড়াও, এটি একটি অপরিবর্তনীয় শ্রেণিকে (আইটেম 15) গ্যারান্টি তৈরি করতে অনুমতি দেয় যে দুটি সমান দৃষ্টান্ত উপস্থিত নেই: a.equals (খ) যদি এবং কেবল যদি a == খ হয়। যদি কোনও শ্রেণি এই গ্যারান্টিটি তৈরি করে তবে তার ক্লায়েন্টরা সমতুল্য (অবজেক্ট) পদ্ধতির পরিবর্তে == অপারেটরটি ব্যবহার করতে পারে, যার ফলে উন্নত কর্মক্ষমতা দেখা দিতে পারে। এনাম ধরণের (আইটেম 30) এই গ্যারান্টি সরবরাহ করে।
কার্যকর জাভা থেকে, জোশুয়া ব্লচ (আইটেম 1, পৃষ্ঠা 6)
স্থির
সদস্য 'স্ট্যাটিক' কীওয়ার্ড সহ ঘোষণা করলেন।
কারখানা পদ্ধতি
এমন পদ্ধতি যা নতুন অবজেক্ট তৈরি করে এবং ফেরত দেয়।
জাভাতে
প্রোগ্রামিং ভাষা 'স্ট্যাটিক' অর্থের সাথে প্রাসঙ্গিক তবে 'কারখানার' সংজ্ঞা অনুসারে নয় definition
জাভা বাস্তবায়নে 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(...)