কারখানার প্যাটার্ন কারখানার পদ্ধতি কখন ব্যবহার করবেন?


279

কারখানা শ্রেণীর পরিবর্তে কোনও বস্তুর মধ্যে কারখানার পদ্ধতিগুলি ব্যবহার করা কখন ভাল ধারণা?


উত্তর:


387

আমার ক্লাসগুলি 'লোক' হওয়ার দিক দিয়ে ডিজাইন প্যাটেনগুলি সম্পর্কে ভাবতে পছন্দ করি এবং প্যাটার্নগুলি হ'ল লোকেরা একে অপরের সাথে কথা বলে।

সুতরাং, আমার কাছে কারখানার প্যাটার্নটি হিয়ারিং এজেন্সির মতো। আপনি এমন একজনকে পেয়েছেন যার জন্য পরিবর্তনশীল সংখ্যক শ্রমিকের প্রয়োজন হবে। এই ব্যক্তিটি তাদের ভাড়া করা লোকদের মধ্যে তাদের কিছু তথ্য প্রয়োজন হতে পারে তবে এটি এটি।

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

একইভাবে, একটি কারখানা ব্যবহার করে গ্রাহকরা কীভাবে তাদের তৈরি করা হয় বা তাদের নির্ভরতা কী তা বিশদ না জেনে নতুন সামগ্রী তৈরি করতে দেয় - তাদের কেবলমাত্র তারা যা চান তা তথ্য দিতে হবে।

public interface IThingFactory
{
    Thing GetThing(string theString);
}

public class ThingFactory : IThingFactory
{
    public Thing GetThing(string theString)
    {
        return new Thing(theString, firstDependency, secondDependency);
    }
}

সুতরাং, এখন থিংফ্যাক্টারের গ্রাহক থিংটির নির্ভরতা সম্পর্কে জানতে না পেরে একটি জিনিস পেতে পারেন, গ্রাহক থেকে আসা স্ট্রিং ডেটা বাদে।


17
গেটথিং () এর কংক্রিট বাস্তবায়ন কোথায় প্রথম নির্ভরতা এবং দ্বিতীয়নির্ভরতার মানগুলি পুনরুদ্ধার করে?
মাইকেইগ 36

88
কেউ আমাকে বলতে পারেন যে এটি কীভাবে ওপি-র প্রশ্নের উত্তর দেয়? এটি কেবল 'ফ্যাক্টরি প্যাটার্ন' কী তা বর্ণনা করে এবং তারপরে 'কারখানা পদ্ধতি' উদাহরণ দেয়, যা তিনটি 'কারখানার প্যাটার্নস' এর মধ্যে একটি মাত্র। অন্য কথায়, আমি কোথাও কোনও তুলনা দেখছি না।
ফোরথিংকার

4
ওপির প্রশ্নে স্পষ্টভাবে উল্লেখ রয়েছে within an object instead of a Factory class। আমি মনে করি তিনি সেই দৃশ্যের অর্থ যেখানে আপনি সিটি বেসরকারী করেন এবং ক্লাসটি ইনস্ট্যান্ট করতে একটি স্ট্যাটিক পদ্ধতি ব্যবহার করেন (কোনও অবজেক্ট তৈরি করুন)। তবে এই উদাহরণটি অনুসরণ করতে ThingFactoryপ্রথমে Thingঅবজেক্টগুলি পাওয়ার জন্য শ্রেণিকে প্রথমে ইনস্ট্যান্ট করতে হবে , যা Factory classএটি কার্যকর হয়।
আতিয়ার

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

8
ওপি জিজ্ঞাসা করেছেন কখন । কিউরিয়ু কীভাবে উত্তর দিল । যদিও উত্তরটির শৈলী প্রশংসনীয় তবে এই প্রশ্নের প্রসঙ্গে এটি কেবল গোলমাল।
8bitjunkie

96

কারখানার পদ্ধতিগুলি কনস্ট্রাক্টরের বিকল্প হিসাবে বিবেচনা করা উচিত - বেশিরভাগ ক্ষেত্রে যখন কনস্ট্রাক্টরগুলি যথেষ্ট পরিমাণে ভাবপ্রবণ হয় না, অর্থাৎ।

class Foo{
  public Foo(bool withBar);
}

যেমন মত প্রকাশ করা যায় না:

class Foo{
  public static Foo withBar();
  public static Foo withoutBar();
}

ফ্যাক্টরি ক্লাসগুলি দরকারী যখন আপনার প্রয়োজনীয় বিষয়টি নির্মাণের জন্য জটিল প্রক্রিয়া প্রয়োজন, যখন নির্মাণের এমন নির্ভরতা প্রয়োজন যা আপনি প্রকৃত শ্রেণির জন্য চান না, যখন আপনাকে বিভিন্ন বস্তু নির্মাণের প্রয়োজন হয় ইত্যাদি need


2
এখানে কারখানার ক্লাস কোথায়?
Koray Tugay

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

5
এটি লক্ষ করা উচিত যে স্থির কারখানার পদ্ধতিগুলি গ্যাং অফ ফোর থেকে সম্পূর্ণ পৃথক: কারখানা পদ্ধতি নকশার প্যাটার্ন।
jaco0646

76

একটি পরিস্থিতি যেখানে আমি ব্যক্তিগতভাবে পৃথক কারখানার ক্লাসগুলি বোঝার জন্য পাই তা হ'ল আপনি যখন চূড়ান্ত অবজেক্টটি তৈরি করার চেষ্টা করছেন তা বেশ কয়েকটি অন্যান্য বস্তুর উপর নির্ভর করে। উদাহরণস্বরূপ, পিএইচপি-তে: ধরুন আপনার একটি Houseঅবজেক্ট রয়েছে যার পরিবর্তে একটি Kitchenএবং একটি LivingRoomঅবজেক্ট রয়েছে এবং LivingRoomঅবজেক্টটির ভিতরেও একটি TVঅবজেক্ট রয়েছে ।

এটি অর্জনের সবচেয়ে সহজ পদ্ধতিটি হ'ল প্রতিটি বস্তু তাদের নির্মাণ পদ্ধতিতে তাদের বাচ্চাদের তৈরি করে, তবে বৈশিষ্ট্যগুলি তুলনামূলকভাবে বাসা বেঁধে দেওয়া হয়, যখন আপনার Houseব্যর্থতা তৈরি করতে আপনাকে ব্যর্থ হয় ঠিক কীভাবে বিচ্ছিন্ন করার চেষ্টা করতে কিছু সময় ব্যয় করতে পারে।

বিকল্পটি নিম্নলিখিতটি করা (নির্ভরতা ইঞ্জেকশন, যদি আপনি অভিনব শব্দটি পছন্দ করেন):

$TVObj = new TV($param1, $param2, $param3);
$LivingroomObj = new LivingRoom($TVObj, $param1, $param2);
$KitchenroomObj = new Kitchen($param1, $param2);
$HouseObj = new House($LivingroomObj, $KitchenroomObj);

এখানে যদি Houseব্যর্থতা তৈরির প্রক্রিয়াটি ব্যর্থ হয় তবে দেখার জন্য কেবলমাত্র একটি জায়গা রয়েছে, তবে প্রতি বারই নতুন চায় এই অংশটি ব্যবহার Houseকরা সুবিধাজনক। কারখানাগুলি প্রবেশ করান:

class HouseFactory {
    public function create() {
        $TVObj = new TV($param1, $param2, $param3);
        $LivingroomObj = new LivingRoom($TVObj, $param1, $param2);
        $KitchenroomObj = new Kitchen($param1, $param2);
        $HouseObj = new House($LivingroomObj, $KitchenroomObj);

        return $HouseObj;
    }
}

$houseFactory = new HouseFactory();
$HouseObj = $houseFactory->create();

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


1
যদিও কেউ এই বিষয়ে একটি ইউনিট পরীক্ষা করবে কীভাবে? আমি ভেবেছিলাম একটি ক্লাসে "নতুন" কীওয়ার্ডটি ব্যবহার করা খারাপ অভ্যাস হিসাবে বিবেচিত হবে কারণ এটি ইউনিট পরীক্ষা করা যায় না। বা কোনও ফ্যাক্টরি বলতে কি সেই নিয়মের ব্যতিক্রম হতে পারে?
AgmLauncher

1
: @AgmLauncher আমি ভাল হিসাবে যখন আমি ইউনিট টেস্টিং দিয়ে শুরু পেয়েছিলাম একই প্রশ্ন ছিল, খুঁজে বার করো stackoverflow.com/questions/10128780/...
Mahn

1
এটি পেল না। HouseFactoryক্লাসে বিভিন্ন অবজেক্ট তৈরির জন্য ঠিক কীভাবে প্যারামগুলি পাস করা হয় ?
আতিয়ার

1
@ মাহন, আপনি কি শেষ পর্যন্ত অনেকগুলি প্যারাম দিয়ে শেষ করবেন না?
পেসারিয়ার

1
@Pacerier তোমার জন্য কিছু কিভাবে মডেল, আপনার চাহিদার উপর নির্ভর করে, কিন্তু আপনি না সিদ্ধান্ত নিতে যে সবসময় পাস করতে হবে যে পরামিতি createপদ্ধতি। উদাহরণস্বরূপ, যদি আপনার Houseসর্বদা একই ধরণের হয়ে থাকে LivingRoomতবে তার প্যারামগুলিকে যুক্তি হিসাবে পাস করার পরিবর্তে কারখানার শ্রেণিতে হার্ডকোড করা বুদ্ধিমান হতে পারে। অথবা আপনি যদি আপনার কয়েক ধরণের ধরণের থাকে এবং প্রতিটি ধরণের জন্য হার্ডকোডযুক্ত প্যারামিটারগুলির সাথে ভিতরে স্যুইচ করে থাকেন তবে আপনি typeআপনার HouseFactory::createপদ্ধতির পক্ষে একটি যুক্তি সরবরাহ করতে চাইতে পারেন LivingRoom
মাহন

19

কারখানা বা কারখানার পদ্ধতি ব্যবহারের পিছনে ধারণাটি পরিষ্কারভাবে আলাদা করা গুরুত্বপূর্ণ। উভয়ই পারস্পরিক একচেটিয়া বিভিন্ন ধরণের অবজেক্ট তৈরির সমস্যা সমাধানের উদ্দেশ্যে।

আসুন "কারখানা পদ্ধতি" সম্পর্কে সুনির্দিষ্ট করা যাক:

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

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

interface Deliverable 
{
    /*********/
}

abstract class DefaultProducer 
{

    public void taskToBeDone() 
    {   
        Deliverable deliverable = factoryMethodPattern();
    }
    protected abstract Deliverable factoryMethodPattern();
}

class SpecificDeliverable implements Deliverable 
{
 /***SPECIFIC TASK CAN BE WRITTEN HERE***/
}

class SpecificProducer extends DefaultProducer 
{
    protected Deliverable factoryMethodPattern() 
    {
        return new SpecificDeliverable();
    }
}

public class MasterApplicationProgram 
{
    public static void main(String arg[]) 
    {
        DefaultProducer defaultProducer = new SpecificProducer();
        defaultProducer.taskToBeDone();
    }
}

15

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


15

বস্তুর ভিতরে কারখানার পদ্ধতিগুলি ব্যবহার করা ভাল ধারণা যখন:

  1. অবজেক্টের ক্লাসটি জানে না এটির সঠিক কোন সাব-ক্লাসগুলি তৈরি করতে হবে
  2. অবজেক্টের ক্লাসটি এমনভাবে ডিজাইন করা হয়েছে যাতে এটি তৈরি করা অবজেক্টগুলি উপ-শ্রেণীর দ্বারা নির্দিষ্ট করা হয়েছিল
  3. অবজেক্টের ক্লাস সহায়ক সাব-ক্লাসগুলিতে তার দায়িত্ব নিযুক্ত করে এবং সঠিক শ্রেণিটি এই দায়িত্বগুলি কী গ্রহণ করবে তা জানে না

বিমূর্ত কারখানার শ্রেণি ব্যবহার করা ভাল ধারণা যখন:

  1. আপনার অবজেক্টটি এর অভ্যন্তরীণ বস্তুগুলি কীভাবে তৈরি এবং ডিজাইন করা হয়েছে তার উপর নির্ভর করবে না
  2. সংযুক্ত বস্তুর গোষ্ঠী একসাথে ব্যবহার করা উচিত এবং আপনার এই সীমাবদ্ধতা পরিবেশন করা দরকার
  3. সংযুক্ত বস্তুগুলির বেশ কয়েকটি সম্ভাব্য পরিবারের একটির দ্বারা অবজেক্টটি কনফিগার করা উচিত যা আপনার প্যারেন্ট অবজেক্টের একটি অংশ হবে
  4. শিশুদের অবজেক্টগুলি কেবল ইন্টারফেস দেখানো ভাগ করা প্রয়োজন তবে তা বাস্তবায়ন নয়

9

ইউএমএল থেকে

এখানে চিত্র বর্ণনা লিখুন

পণ্য: এটি কারখানা পদ্ধতিটি তৈরি করে এমন একটি সামগ্রীর একটি ইন্টারফেস সংজ্ঞায়িত করে।

কংক্রিটপ্রডাক্ট: পণ্য ইন্টারফেস প্রয়োগ করে

স্রষ্টা: কারখানা পদ্ধতি ঘোষণা করে

কনক্রিয়েটক্রিটর: একটি কংক্রিটপ্রোডাক্টের উদাহরণ ফেরত ফ্যাক্টরি পদ্ধতি কার্যকর করে

সমস্যার বিবৃতি: ফ্যাক্টরি পদ্ধতিগুলি ব্যবহার করে গেমসের একটি কারখানা তৈরি করুন যা গেমের ইন্টারফেসটিকে সংজ্ঞায়িত করে।

টুকিটাকি সংকেতলিপি:

import java.util.HashMap;


/* Product interface as per UML diagram */
interface Game{
    /* createGame is a complex method, which executes a sequence of game steps */
    public void createGame();
}

/* ConcreteProduct implementation as per UML diagram */
class Chess implements Game{
    public Chess(){

    }
    public void createGame(){
        System.out.println("---------------------------------------");
        System.out.println("Create Chess game");
        System.out.println("Opponents:2");
        System.out.println("Define 64 blocks");
        System.out.println("Place 16 pieces for White opponent");
        System.out.println("Place 16 pieces for Black opponent");
        System.out.println("Start Chess game");
        System.out.println("---------------------------------------");
    }
}
class Checkers implements Game{
    public Checkers(){

    }
    public void createGame(){
        System.out.println("---------------------------------------");
        System.out.println("Create Checkers game");
        System.out.println("Opponents:2 or 3 or 4 or 6");
        System.out.println("For each opponent, place 10 coins");
        System.out.println("Start Checkers game");
        System.out.println("---------------------------------------");
    }
}
class Ludo implements Game{
    public Ludo(){

    }
    public void createGame(){
        System.out.println("---------------------------------------");
        System.out.println("Create Ludo game");
        System.out.println("Opponents:2 or 3 or 4");
        System.out.println("For each opponent, place 4 coins");
        System.out.println("Create two dices with numbers from 1-6");
        System.out.println("Start Ludo game");
        System.out.println("---------------------------------------");
    }
}

/* Creator interface as per UML diagram */
interface IGameFactory {
    public Game getGame(String gameName);
}

/* ConcreteCreator implementation as per UML diagram */
class GameFactory implements IGameFactory {

     HashMap<String,Game> games = new HashMap<String,Game>();
    /*  
        Since Game Creation is complex process, we don't want to create game using new operator every time.
        Instead we create Game only once and store it in Factory. When client request a specific game, 
        Game object is returned from Factory instead of creating new Game on the fly, which is time consuming
    */

    public GameFactory(){

        games.put(Chess.class.getName(),new Chess());
        games.put(Checkers.class.getName(),new Checkers());
        games.put(Ludo.class.getName(),new Ludo());        
    }
    public Game getGame(String gameName){
        return games.get(gameName);
    }
}

public class NonStaticFactoryDemo{
    public static void main(String args[]){
        if ( args.length < 1){
            System.out.println("Usage: java FactoryDemo gameName");
            return;
        }

        GameFactory factory = new GameFactory();
        Game game = factory.getGame(args[0]);
        if ( game != null ){                    
            game.createGame();
            System.out.println("Game="+game.getClass().getName());
        }else{
            System.out.println(args[0]+  " Game does not exists in factory");
        }           
    }
}

আউটপুট:

java NonStaticFactoryDemo Chess
---------------------------------------
Create Chess game
Opponents:2
Define 64 blocks
Place 16 pieces for White opponent
Place 16 pieces for Black opponent
Start Chess game
---------------------------------------
Game=Chess

এই উদাহরণটি Factoryপ্রয়োগ করে একটি শ্রেণী দেখায় FactoryMethod

  1. Gameসব ধরণের গেমের জন্য ইন্টারফেস। এটি জটিল পদ্ধতিটি সংজ্ঞায়িত করে:createGame()

  2. Chess, Ludo, Checkers গেমগুলির বিভিন্ন রূপ, যা বাস্তবায়ন সরবরাহ করে createGame()

  3. public Game getGame(String gameName)হয় FactoryMethodIGameFactoryবর্গ

  4. GameFactoryকনস্ট্রাক্টরে বিভিন্ন ধরণের গেম প্রাক-তৈরি করে। এটি IGameFactoryকারখানার পদ্ধতি প্রয়োগ করে ।

  5. কমান্ড লাইন যুক্তি হিসাবে গেমের নামটি পাস করা হয় NotStaticFactoryDemo

  6. getGameইন GameFactoryএকটি গেমের নাম গ্রহণ করে এবং সংশ্লিষ্ট Gameবস্তুটি প্রদান করে।

কারখানার:

ক্লায়েন্টের কাছে ইনস্ট্যান্টেশন যুক্তিটি প্রকাশ না করেই বস্তু তৈরি করে।

FactoryMethod

কোনও অবজেক্ট তৈরির জন্য একটি ইন্টারফেস সংজ্ঞায়িত করুন, তবে সাবক্ল্যাসগুলি সিদ্ধান্ত নিতে দিন কোন শ্রেণিটি ইনস্ট্যান্ট করতে হবে। কারখানা পদ্ধতিটি একটি শ্রেণিকে সাবক্লাসে স্থগিত করে দেয়

ব্যবহারের ক্ষেত্রে:

কখন ব্যবহার করবেন: Clientজানেন না রানটাইমের সময় কী কংক্রিটের ক্লাস তৈরি করা প্রয়োজন, তবে কেবল একটি ক্লাস পেতে চান যা কাজটি করবে।


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

getArea()মোটেই কারখানার পদ্ধতি নয়
ক্র্যানিও

1
আমার আলাদা মতামত রয়েছে - বিশেষজ্ঞরা দয়া করে বৈধতা দিন এবং নোটগুলি রাখুন। ১. ক্লায়েন্টের (বা চালকের) ইন্টারজেক্ট অব ইন্টারেস্টের প্রয়োজন ... সুতরাং নতুন গেমফ্যাক্ট্রি () কল করার দরকার নেই বরং ফ্যাক্টরি ক্লাসের একটি স্ট্যাটিক গেইট ইনস্ট্যান্স () হওয়া উচিত ২.এছাড়াও যদি তাই থাকে তবে গেমসপুট (চেস.ক্লাস.সেটনাম) ( ), নতুন দাবা ()); দাবা সর্বদা একই প্রসঙ্গে ফিরে আসবে [যদি স্থির হিসাবে প্রয়োগ করা হয়] - কীভাবে সেই পরিস্থিতিটি সবচেয়ে কার্যকরভাবে পরিচালনা করা যায়?
অর্ণব দত্ত

আমি অ স্থিতিশীল কারখানার উদাহরণ দিয়েছি। আপনি চাইলে স্ট্যাটিক ব্লক এবং পদ্ধতিগুলি সহ এটি প্রয়োগ করতে পারেন। আপনার প্রশ্ন সম্পর্কিত: 1। ক্লায়েন্ট গেমটি পাওয়ার জন্য কারখানাকে কল করবে। ২. আমি এই বস্তুটি একবার রাখছি এবং সমস্ত গেট একই দৃষ্টিতে ফিরে আসবে - দাবা একই রেফারেন্স। প্রতিটি প্রাপ্তির জন্য ফেরত দেওয়া হয়েছে
রবীন্দ্র বাবু

6

এটা সত্যিই স্বাদের বিষয়। কারখানার ক্লাসগুলি প্রয়োজনীয় হিসাবে বিমূর্ত / ইন্টারফেস করা যেতে পারে, যেখানে কারখানার পদ্ধতিগুলি হালকা ওজনের হয় (এবং এটি পরীক্ষার জন্যও ঝোঁক থাকে, যেহেতু তাদের কোনও সংজ্ঞায়িত প্রকার নেই, তবে তাদের প্রয়োজন মতো একটি পরিচিত রেজিস্ট্রেশন পয়েন্ট প্রয়োজন হবে) লোকেটর তবে কারখানার পদ্ধতিগুলি সনাক্ত করার জন্য)।


4

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

ডাব্লুসিএফ বিভিন্ন পরিস্থিতিতে সার্ভিস হস্ট অবজেক্টগুলি পুনরুদ্ধার করতে সার্ভিস হস্টফ্যাক্টরি ক্লাস ব্যবহার করে। স্ট্যান্ডার্ড সার্ভিস হস্টফ্যাক্টরি IS দ্বারা .svc ফাইলগুলির জন্য সার্ভিস হস্ট উদাহরণগুলি পুনরুদ্ধার করতে ব্যবহৃত হয় , তবে জাভাস্ক্রিপ্ট ক্লায়েন্টগুলিতে সিরিয়ালাইজেশন ফিরিয়ে আনার জন্য একটি ওয়েবস্ক্রিপ্টসওয়ারিহস্টফ্যাক্টরি ব্যবহৃত হয়। ADO.NET ডেটা পরিষেবাদিগুলির নিজস্ব বিশেষ ডেটা সার্ভিসহোস্টফ্যাক্টরি রয়েছে এবং এএসপি.নেটের অ্যাপ্লিকেশন সার্ভিসহোস্টফ্যাক্টরি রয়েছে কারণ এর পরিষেবাগুলিতে ব্যক্তিগত নির্মাণকারী রয়েছে।

যদি আপনার কাছে কেবলমাত্র একটি ক্লাস থাকে যা কারখানাটি গ্রাস করে, তবে আপনি কেবলমাত্র সেই শ্রেণীর মধ্যে একটি কারখানা পদ্ধতি ব্যবহার করতে পারেন।


2

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

এখন একটি নতুন প্রয়োজনীয়তা ছবিতে আসে যে অর্ডার অবজেক্টটি গ্রাহক সমিতি (নতুন নির্ভরতা) ছাড়াই ইনস্ট্যান্ট করা যাবে না। এখন আপনার নিম্নলিখিত বিবেচনা আছে।

1- আপনি কনস্ট্রাক্টর ওভারলোড তৈরি করেন যা কেবলমাত্র নতুন বাস্তবায়নের জন্য কাজ করবে। (গ্রহণযোগ্য নয়) 2- আপনি অর্ডার () স্বাক্ষর পরিবর্তন করেন এবং প্রতিটি অনুরোধ পরিবর্তন করেন। (একটি ভাল অনুশীলন এবং বাস্তব ব্যথা নয়)।

পরিবর্তে যদি আপনি অর্ডার ক্লাসের জন্য কোনও কারখানা তৈরি করে থাকেন তবে আপনাকে কেবল একটি কোডের লাইন পরিবর্তন করতে হবে এবং আপনি যেতে ভাল। আমি প্রায় প্রতিটি সামগ্রিক সমিতির জন্য কারখানা ক্লাসের পরামর্শ দিই। আশা করি এইটি কাজ করবে.


1

আপনি যদি ব্যবহারের ক্ষেত্রে পৃথক অবজেক্ট তৈরি করতে চান। এটা কার্যকরী.

public class factoryMethodPattern {
      static String planName = "COMMERCIALPLAN";
      static int units = 3;
      public static void main(String args[]) {
          GetPlanFactory planFactory = new GetPlanFactory();
          Plan p = planFactory.getPlan(planName);
          System.out.print("Bill amount for " + planName + " of  " + units
                        + " units is: ");
          p.getRate();
          p.calculateBill(units);
      }
}

abstract class Plan {
      protected double rate;

      abstract void getRate();

      public void calculateBill(int units) {
            System.out.println(units * rate);
      }
}

class DomesticPlan extends Plan {
      // @override
      public void getRate() {
            rate = 3.50;
      }
}

class CommercialPlan extends Plan {
      // @override
      public void getRate() {
            rate = 7.50;
      }
}

class InstitutionalPlan extends Plan {
      // @override
      public void getRate() {
            rate = 5.50;
      }
}

class GetPlanFactory {

      // use getPlan method to get object of type Plan
      public Plan getPlan(String planType) {
            if (planType == null) {
                  return null;
            }
            if (planType.equalsIgnoreCase("DOMESTICPLAN")) {
                  return new DomesticPlan();
            } else if (planType.equalsIgnoreCase("COMMERCIALPLAN")) {
                  return new CommercialPlan();
            } else if (planType.equalsIgnoreCase("INSTITUTIONALPLAN")) {
                  return new InstitutionalPlan();
            }
            return null;
      }
}

1

যে শ্রেণীর সাথে কাজ করা উচিত বস্তুর জন্য উপ-শ্রেণীর উদ্দেশ্যে অবজেক্টটি স্থগিত করা ফ্যাক্টরি প্যাটার্নের উদাহরণ হিসাবে দেখা যেতে পারে।

আমি https://stackoverflow.com/a/49110001/504133 এ অন্য উত্তরে বিস্তারিতভাবে উল্লেখ করেছি


1

আমি মনে করি এটি আপনার কোডটিতে আনতে চান এমন আলগা কাপলিং ডিগ্রির উপর নির্ভর করবে।

কারখানার পদ্ধতি জিনিসগুলিকে খুব ভালভাবে ডাইপুল করে তবে কারখানার ক্লাস নং।

অন্য কথায়, আপনি যদি কোনও সাধারণ কারখানা (কারখানার শ্রেণি হিসাবে পরিচিত) ব্যবহার করেন তবে ফ্যাক্টরি পদ্ধতিটি ব্যবহার করা হলে জিনিসগুলি পরিবর্তন করা সহজ।

এই উদাহরণটি দেখুন: https://connected2know.com/programming/java-factory-pattern/ । এখন, কল্পনা করুন যে আপনি একটি নতুন প্রাণী আনতে চান। কারখানার শ্রেণিতে আপনাকে কারখানা পরিবর্তন করতে হবে তবে কারখানার পদ্ধতিতে, না, আপনাকে কেবল একটি নতুন সাবক্লাস যুক্ত করতে হবে।


0

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

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


0

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

কারখানার পেটারটি পলিমারফিজম, নির্ভরতা ইনজেকশন এবং নিয়ন্ত্রণের বিপরীত ব্যবহার করে।

কারখানা প্যাটার্নগুলির উল্লিখিত উদ্দেশ্য হ'ল: Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.

সুতরাং আসুন আমরা বলি যে আপনি একটি অপারেটিং সিস্টেম বা ফ্রেমওয়ার্ক তৈরি করছেন এবং আপনি সমস্ত বিযুক্ত উপাদান তৈরি করছেন।

পিএইচপি-তে ফ্যাক্টরি প্যাটার্নের ধারণার একটি সাধারণ উদাহরণ এখানে। আমি এর সবগুলিতে ১০০% নাও হতে পারি তবে এটি সাধারণ উদাহরণ হিসাবে পরিবেশন করার উদ্দেশ্যে। আমি বিশেষজ্ঞ নই।

class NumbersFactory {
    public static function makeNumber( $type, $number ) {
        $numObject = null;
        $number = null;

        switch( $type ) {
            case 'float':
                $numObject = new Float( $number );
                break;
            case 'integer':
                $numObject = new Integer( $number );
                break;
            case 'short':
                $numObject = new Short( $number );
                break;
            case 'double':
                $numObject = new Double( $number );
                break;
            case 'long':
                $numObject = new Long( $number );
                break;
            default:
                $numObject = new Integer( $number );
                break;
        }

        return $numObject;
    }
}

/* Numbers interface */
abstract class Number {
    protected $number;

    public function __construct( $number ) {
        $this->number = $number;
    }

    abstract public function add();
    abstract public function subtract();
    abstract public function multiply();
    abstract public function divide();
}
/* Float Implementation */
class Float extends Number {
    public function add() {
        // implementation goes here
    }

    public function subtract() {
        // implementation goes here
    }

    public function multiply() {
        // implementation goes here
    }

    public function divide() {
        // implementation goes here
    }
}
/* Integer Implementation */
class Integer extends Number {
    public function add() {
        // implementation goes here
    }

    public function subtract() {
        // implementation goes here
    }

    public function multiply() {
        // implementation goes here
    }

    public function divide() {
        // implementation goes here
    }
}
/* Short Implementation */
class Short extends Number {
    public function add() {
        // implementation goes here
    }

    public function subtract() {
        // implementation goes here
    }

    public function multiply() {
        // implementation goes here
    }

    public function divide() {
        // implementation goes here
    }
}
/* Double Implementation */
class Double extends Number {
    public function add() {
        // implementation goes here
    }

    public function subtract() {
        // implementation goes here
    }

    public function multiply() {
        // implementation goes here
    }

    public function divide() {
        // implementation goes here
    }
}
/* Long Implementation */
class Long extends Number {
    public function add() {
        // implementation goes here
    }

    public function subtract() {
        // implementation goes here
    }

    public function multiply() {
        // implementation goes here
    }

    public function divide() {
        // implementation goes here
    }
}

$number = NumbersFactory::makeNumber( 'float', 12.5 );

আমি এখানে কী ঘটছে তা বুঝতে পেরেছি, তবে এর মূল বক্তব্যটি আমি পাই না। কি NumbersFactory::makeNumber( 'float', 12.5 );আমার উপর দান ঠিক বলছে new Float(12.5);যদি আমি জানি আমি একটি প্রয়োজন Float? এটাই আমি কারখানার কথা বুঝতে পারছি না ... কী কথা?
BadHorsie

এটি আপনাকে বিভিন্ন বাস্তবায়ন চয়ন করতে দেয় এবং আপনাকে কেবল একটিতে আবদ্ধ করে না। একটি ইন্টারফেস প্রতিষ্ঠিত হয় এবং সমস্ত বাস্তবায়ন অবশ্যই নিশ্চয়তা এবং সম্মান করে।
রবার্ট রোচা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.