অ্যাবস্ট্রাক্ট কারখানা এবং কারখানার নকশার ধরণগুলির মধ্যে পার্থক্য কী?


454

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

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

আমার চূড়ান্ত দুটি প্রশ্ন একটি একক উক্তি সম্পর্কে যা আমি সম্পূর্ণরূপে বুঝতে পারি না যে আমি অসংখ্য জায়গায় দেখেছি:

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

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

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

বিশেষত শেষ প্রশ্নের সাথে যে কোনও সহায়তা, প্রশংসিত হবে।



ক্লায়েন্টের দৃষ্টিকোণ থেকে "উদাহরণটি কীভাবে তৈরি করা" দেখে তা আপনাকে উদ্ধৃতিটি বুঝতে সহায়তা করবে।
কার্তিক বোস

@ নওফাল, এই থ্রেডের উত্তরগুলি ভয়াবহ।
jaco0646

উত্তর:


494

দুজনের মধ্যে পার্থক্য

একটি "ফ্যাক্টরি পদ্ধতি" এবং "বিমূর্ত কারখানা" এর মধ্যে প্রধান পার্থক্য হ'ল ফ্যাক্টরি পদ্ধতিটি একটি একক পদ্ধতি এবং একটি বিমূর্ত কারখানা একটি বস্তু। আমি মনে করি প্রচুর লোক এই দুটি পদকে বিভ্রান্ত করে এবং এগুলি পরস্পরের পরিবর্তে ব্যবহার শুরু করে। আমার মনে আছে আমি যখন শিখলাম তখন ঠিক কী পার্থক্য ছিল তা খুঁজে পেতে আমার বেশ কষ্ট হয়েছিল।

কারখানার পদ্ধতিটি কেবল একটি পদ্ধতি, এটি একটি সাবক্লাসে ওভাররাইড করা যেতে পারে, সুতরাং আপনার উদ্ধৃতিটির দ্বিতীয়ার্ধ:

... কারখানার পদ্ধতি প্যাটার্নটি উত্তরাধিকার ব্যবহার করে এবং পছন্দসই অবজেক্টটি ইনস্ট্যান্টেশন পরিচালনা করতে একটি সাবক্লাসের উপর নির্ভর করে।

উক্তিটি ধরে নিয়েছে যে কোনও বস্তু এখানে তার নিজস্ব কারখানার পদ্ধতি কল করছে । সুতরাং একমাত্র জিনিস যা প্রত্যাবর্তনের মান পরিবর্তন করতে পারে তা হবে একটি সাবক্লাস।

বিমূর্ত ফ্যাক্টরি এমন একটি জিনিস যা এর উপর একাধিক কারখানার পদ্ধতি রয়েছে। আপনার উক্তিটির প্রথমার্ধের দিকে তাকিয়ে:

... অ্যাবস্ট্রাক্ট ফ্যাক্টরি প্যাটার্ন সহ, একটি শ্রেণি কম্পোজিশনের মাধ্যমে অন্য বস্তুর কাছে অবজেক্ট ইনস্ট্যান্টেশনের দায়িত্ব অর্পণ করে ...

তারা যা বলছে তা হ'ল একটি অবজেক্ট এ আছে, যিনি একটি ফু অবজেক্ট তৈরি করতে চান। Foo অবজেক্টটি নিজে তৈরি করার পরিবর্তে (উদাহরণস্বরূপ, একটি ফ্যাক্টরি পদ্ধতি সহ), এটি Foo অবজেক্ট তৈরি করতে একটি পৃথক অবজেক্ট (বিমূর্ত কারখানা) পেতে চলেছে।

কোড উদাহরণ

আপনাকে পার্থক্যটি দেখানোর জন্য, এখানে ব্যবহারের জন্য একটি ফ্যাক্টরি পদ্ধতি রয়েছে:

class A {
    public void doSomething() {
        Foo f = makeFoo();
        f.whatever();   
    }

    protected Foo makeFoo() {
        return new RegularFoo();
    }
}

class B extends A {
    protected Foo makeFoo() {
        //subclass is overriding the factory method 
        //to return something different
        return new SpecialFoo();
    }
}

এবং এখানে ব্যবহারে একটি বিমূর্ত কারখানা রয়েছে:

class A {
    private Factory factory;

    public A(Factory factory) {
        this.factory = factory;
    }

    public void doSomething() {
        //The concrete class of "f" depends on the concrete class
        //of the factory passed into the constructor. If you provide a
        //different factory, you get a different Foo object.
        Foo f = factory.makeFoo();
        f.whatever();
    }
}

interface Factory {
    Foo makeFoo();
    Bar makeBar();
    Aycufcn makeAmbiguousYetCommonlyUsedFakeClassName();
}

//need to make concrete factories that implement the "Factory" interface here

15
এটি এমন দুর্দান্ত ব্যাখ্যা। তবে, সর্বাধিক গুরুত্বপূর্ণ অংশটি কী উত্তরহীন রেখে গেছে, এবং তা হ'ল: কখন একটি ব্যবহার করা হবে, এবং অন্য প্যাটার্নটি কখন?
ক্রোফ

11
নিশ্চিত না যে এটি সঠিক। খুব নিশ্চিত কারখানার পদ্ধতিটি কারখানার পদ্ধতিগুলির নাম অনুসারে একটি নকশার প্যাটার্ন , তবে শ্রেণিবদ্ধ কাঠামো এবং উত্তরাধিকার অন্তর্ভুক্ত। এটি একক পদ্ধতি নয়।
আভিভ কোহন

2
সুতরাং এটি কি সঠিক: কারখানাটি বিভিন্ন উদ্দেশ্যে নিয়মিত সমস্ত ক্লাসে একটি পদ্ধতি হতে পারে। তবে অ্যাবস্ট্রাক্ট কারখানা ক্লায়েন্ট / ক্লায়েন্ট দ্বারা ব্যবহৃত একটি বস্তু এবং কোনও পরিবারে কিছু পণ্য তৈরি করার জন্য কেবল দায়বদ্ধ?
হাইউ এনগুইন

আপনার কি "সুপারফু" শব্দটিতে "সুপার" শব্দটি ব্যবহার করা হয়েছে কেবল ফু-এর একটি বিশেষ কেস বোঝাতে, নাকি এর অর্থ আসলে সুপার ক্লাস? আমি যেমন ধরে নিয়েছিলাম এটি অবশ্যই একটি সাবক্লাস হতে হবে।
dahui

@ ডাহুই হ্যাঁ এটি একটি সাবক্লাস। আমি এটি SpecialFooআরও পরিষ্কার হতে পরিবর্তন করেছি ।
টম ডালিং

125

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

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

কারখানার পদ্ধতি ক্লাসে অবজেক্ট তৈরি করতে ব্যবহৃত একটি সহজ পদ্ধতি। এটি সাধারণত সমষ্টিগত মূলে যুক্ত হয় ( Orderশ্রেণীর একটি পদ্ধতি রয়েছে যা বলা হয় CreateOrderLine)

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

বিমূর্ত কারখানা

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

interface IMessageQueueFactory
{
  IMessageQueue CreateOutboundQueue(string name);
  IMessageQueue CreateReplyQueue(string name);
}

public class AzureServiceBusQueueFactory : IMessageQueueFactory
{
      IMessageQueue CreateOutboundQueue(string name)
      {
           //init queue
           return new AzureMessageQueue(/*....*/);
      }

      IMessageQueue CreateReplyQueue(string name)
      {
           //init response queue
           return new AzureResponseMessageQueue(/*....*/);
      }

}

public class MsmqFactory : IMessageQueueFactory
{
      IMessageQueue CreateOutboundQueue(string name)
      {
           //init queue
           return new MsmqMessageQueue(/*....*/);
      }

      IMessageQueue CreateReplyQueue(string name)
      {
           //init response queue
           return new MsmqResponseMessageQueue(/*....*/);
      }
}

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

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

public interface IHttpRequest
{
    // .. all other methods ..

    IHttpResponse CreateResponse(int httpStatusCode);
}

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

তাই আমরা কারখানার পদ্ধতিটি প্রবর্তন করি যাতে প্রতিক্রিয়া শ্রেণি তৈরির বিষয়টিও বিমূর্ত হয়।

সারসংক্ষেপ

পার্থক্যটি হ'ল ফ্যাক্টরি পদ্ধতিযুক্ত শ্রেণীর উদ্দেশ্যে উদ্দেশ্য বস্তু তৈরি করা নয় , যখন একটি বিমূর্ত কারখানাটি কেবলমাত্র বস্তু তৈরি করতে ব্যবহার করা উচিত।

কারখানার পদ্ধতিগুলি ব্যবহার করার সময় কারও যত্ন নেওয়া উচিত কারণ অবজেক্ট তৈরি করার সময় LSP ( লিসকভ সাবস্টিটিউশন নীতি ) ভঙ্গ করা সহজ ।


3
কেন আমাদের একটি কংক্রিট পণ্য প্রয়োজন?
অ্যান্ড্রু এস

60
কারণ কেউ আইডিয়ায় বিনিয়োগ করতে চায় না।
jgauffin

4
অ্যাবস্ট্রাক্ট ফ্যাক্টরিতে Button()"সম্পর্কিত পণ্যের পরিবার" তৈরির চেয়ে আরও বেশি কিছু তৈরি করা উচিত । উদাহরণস্বরূপ, ক্যানোনিকাল GoF উদাহরণ তৈরি করে ScrollBar()এবং Window()। সুবিধাটি হ'ল বিমূর্ত কারখানাটি তার একাধিক পণ্য জুড়ে একটি সাধারণ থিম প্রয়োগ করতে পারে।
jaco0646

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

1
@ অ্যান্ড্রুস: আপনার প্রশ্নের উত্তর দিতে। একই বিমূর্ততা (ইন্টারফেস) জন্য আমাদের যদি বিভিন্ন কংক্রিট পণ্য (ক্লাস) না রাখার প্রয়োজন হয় তবে আমাদের সম্ভবত কারখানার প্যাটার্নের পরিবর্তে বিল্ডার প্যাটার্নের প্রয়োজন। (কখনও না থেকে আরও দেরী;))
jgauffin

95

অ্যাস্ট্রাক্টফ্যাক্টরি এবং কারখানার নকশার ধরণগুলির মধ্যে পার্থক্য নিম্নরূপ:

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

কারখানার পদ্ধতি প্যাটার্ন বাস্তবায়ন: কারখানার পদ্ধতি ইউএমএল

বিমূর্ত কারখানার প্যাটার্ন বাস্তবায়ন:

বিমূর্ত কারখানা ইউএমএল


13
মিম, বিমূর্ত কারখানার উদাহরণ সম্পর্কে নিশ্চিত নন। আমি মনে করি যে আকৃতি কারখানা এবং রঙ কারখানার একই পদ্ধতি প্রয়োগ করা উচিত। তবে আমি যদি ঠিক আছি তবে নমুনার কোনও বুদ্ধি নেই।
জোয়াকুইন ইয়ারচুক

4
বুলেট পয়েন্ট সঠিক; তবে উভয় চিত্র সম্পূর্ণ ভুল এবং খুব বিভ্রান্তিকর। বিমূর্ত কারখানার সঠিক মডেলের জন্য @ ট্রাইং থেকে নীচের চিত্রটি দেখুন।
jaco0646

1
আমি 2 ডায়াগ্রাম সত্যিই খুব বিভ্রান্তিকর একমত হতে হবে। আমি এগুলি টিউটোরিয়ালপয়েন্ট ওয়েবসাইটে দেখেছি এবং সত্য বলতে আমি তাদের সাথে 100% একমত নই। যদিও বর্ণনাগুলি দেখতে দুর্দান্ত দেখাচ্ছে
সফটওয়্যার

এটি অত্যন্ত বিভ্রান্তিকর।
ডায়োদা_

50+ upvotes এবং চিত্রগুলি খুব ভুল very প্রমাণ আপনি SO- তে অনেক ডিজাইনের প্যাটার্ন উত্তরগুলিতে বিশ্বাস করতে পারবেন না।
ফুহরম্যানেটর

27

অ্যাবস্ট্রাক্ট ফ্যাক্টরি এবং কারখানা পদ্ধতির মধ্যে প্রধান পার্থক্য হ'ল সংশ্লেষ দ্বারা বিমূর্ত কারখানা প্রয়োগ করা হয় ; কিন্তু কারখানার পদ্ধতি উত্তরাধিকারী দ্বারা প্রয়োগ করা হয়

হ্যাঁ, আপনি এটি সঠিকভাবে পড়েছেন: এই দুটি ধরণের মধ্যে প্রধান পার্থক্য হ'ল পুরাতন রচনা বনাম উত্তরাধিকারের বিতর্ক।

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

বিমূর্ত কারখানা

  1. এখানে উপলব্ধি করার সবচেয়ে গুরুত্বপূর্ণ বিষয়টি হ'ল বিমূর্ত কারখানাটি ক্লায়েন্টের মধ্যে injুকিয়ে দেওয়া হয়। এজন্য আমরা বলি যে মিশ্রণ দ্বারা বিমূর্ত কারখানাটি প্রয়োগ করা হয়েছে by প্রায়শই, নির্ভরতা ইনজেকশন কাঠামোটি সেই কাজটি সম্পাদন করে; তবে ডিআই-র জন্য একটি কাঠামোর প্রয়োজন হয় না।
  2. দ্বিতীয় সমালোচনামূলক পয়েন্ট যে কংক্রিট কারখানার এখানে নয় কারখানার পদ্ধতি বাস্তবায়নের! কারখানার পদ্ধতির উদাহরণ কোডটি আরও নীচে দেখানো হয়েছে।
  3. এবং পরিশেষে, তৃতীয় পয়েন্টটি লক্ষ করা পণ্যগুলির মধ্যে সম্পর্ক: এই ক্ষেত্রে বহির্মুখী এবং উত্তর সারিগুলি। একটি কংক্রিট কারখানায় আজুর সারি তৈরি হয়, অন্যটি এমএসএমকিউ। জিওএফ এই পণ্যের সম্পর্কটিকে একটি "পরিবার" হিসাবে উল্লেখ করে এবং সচেতন হওয়া জরুরী যে এই ক্ষেত্রে পরিবারটি শ্রেণিবৃত্তি নয় not
public class Client {
    private final AbstractFactory_MessageQueue factory;

    public Client(AbstractFactory_MessageQueue factory) {
        // The factory creates message queues either for Azure or MSMQ.
        // The client does not know which technology is used.
        this.factory = factory;
    }

    public void sendMessage() {
        //The client doesn't know whether the OutboundQueue is Azure or MSMQ.
        OutboundQueue out = factory.createProductA();
        out.sendMessage("Hello Abstract Factory!");
    }

    public String receiveMessage() {
        //The client doesn't know whether the ReplyQueue is Azure or MSMQ.
        ReplyQueue in = factory.createProductB();
        return in.receiveMessage();
    }
}

public interface AbstractFactory_MessageQueue {
    OutboundQueue createProductA();
    ReplyQueue createProductB();
}

public class ConcreteFactory_Azure implements AbstractFactory_MessageQueue {
    @Override
    public OutboundQueue createProductA() {
        return new AzureMessageQueue();
    }

    @Override
    public ReplyQueue createProductB() {
        return new AzureResponseMessageQueue();
    }
}

public class ConcreteFactory_Msmq implements AbstractFactory_MessageQueue {
    @Override
    public OutboundQueue createProductA() {
        return new MsmqMessageQueue();
    }

    @Override
    public ReplyQueue createProductB() {
        return new MsmqResponseMessageQueue();
    }
}

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

  1. এখানে উপলব্ধি করার সবচেয়ে গুরুত্বপূর্ণ বিষয়টি ConcreteCreator হ'ল ক্লায়েন্ট। অন্য কথায়, ক্লায়েন্ট হ'ল একটি সাবক্লাস যার পিতামাতার সংজ্ঞা দেওয়া হয় factoryMethod()। এই কারণেই আমরা বলি কারখানা পদ্ধতিটি উত্তরাধিকার দ্বারা প্রয়োগ করা হয়।
  2. দ্বিতীয় সমালোচনামূলক বিষয়টি মনে রাখতে হবে যে ফ্যাক্টরি পদ্ধতি প্যাটার্নটি টেম্পলেট পদ্ধতি প্যাটার্নের বিশেষীকরণ ছাড়া আর কিছুই নয়। দুটি নিদর্শন একটি অভিন্ন কাঠামো ভাগ করে। তারা শুধুমাত্র উদ্দেশ্য পৃথক। ফ্যাক্টরি পদ্ধতিটি ক্রিয়েটিয়াল (এটি কিছু তৈরি করে) যেখানে টেম্পলেট পদ্ধতি আচরণগত (এটি কোনও কিছুর গুণ করে)।
  3. এবং পরিশেষে, তৃতীয় পয়েন্টটি লক্ষণীয় হ'ল Creator(পিতামাতার) বর্গটি তার নিজস্ব প্রার্থনা করে factoryMethod()। যদি আমরা anOperation()প্যারেন্ট ক্লাস থেকে সরান , কেবল একটি একক পদ্ধতি পিছনে রেখে, এটি আর কারখানার পদ্ধতি প্যাটার্ন নয়। অন্য কথায়, ফ্যাক্টরি পদ্ধতিটি পিতামাতার শ্রেণিতে দুটিরও কম পদ্ধতির সাথে প্রয়োগ করা যায় না; এবং একজনকে অবশ্যই অন্যকে ডাকে।
public abstract class Creator {
    public void anOperation() {
        Product p = factoryMethod();
        p.whatever();
    }

    protected abstract Product factoryMethod();
}

public class ConcreteCreator extends Creator {
    @Override
    protected Product factoryMethod() {
        return new ConcreteProduct();
    }
}

বিবিধ। এবং সুন্দর কারখানার প্যাটার্নস

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

প্রতিটি কারখানার প্যাটার্ন জিওএফ-এর একটির সাথে অবশ্যই মিলবে বলে ধরে নেওয়ার ফাঁদে পড়বেন না।


3
দুর্দান্ত উদাহরণগুলির ভিত্তিতে দুর্দান্ত এবং খুব স্পষ্ট উত্তর, এই বিষয়টির সেরা আইএমও।
লুক দুদা

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

আরও একটি প্রশ্ন-মন্তব্য। উচিত factoryMethod()সবসময় হতে protected "কারখানার পদ্ধতি" প্যাটার্ন পদ্ধতি? (আমি হ্যাঁ মনে করি)
ইয়ারোস্লাভ ফেদরুক

1
@ ইয়ারোস্লাভ ফেডরুক, জিওএফ বইটি publicকারখানার পদ্ধতিগুলির জন্য অনুমতি দেয় এবং পদ্ধতিটি এমনকি হওয়াও উচিত নয় abstract; তবে সমালোচনামূলক বিষয়টি হল যে পদ্ধতিটি উত্তরাধিকারের উদ্দেশ্যে করা হয়েছে, সুতরাং এটি (উদাহরণস্বরূপ) হয় staticবা হয়ও না final। আমি পদ্ধতিটি তৈরি করেছি protectedএবং abstractএখানে (প্রয়োজনীয়) এক্সটেনসিবিলিটি হাইলাইট করতে।
jaco0646

@ nits.kk, আপনি কোনও সম্পর্কিত উত্তরে আগ্রহী হতে পারেন ।
jaco0646

26

অ্যাবস্ট্রাক্ট ফ্যাক্টরি সম্পর্কিত পণ্য তৈরির জন্য একটি ইন্টারফেস, তবে কারখানার পদ্ধতি কেবল একটি পদ্ধতি method বিমূর্ত কারখানা একাধিক কারখানা পদ্ধতি প্রয়োগ করা যেতে পারে।

বিমূর্ত কারখানা ইউএমএল


10
আপনি ইতিমধ্যে এখানে একই উত্তর পোস্ট করেছেন । আপনি যদি মনে করেন যে এই প্রশ্নটি অনুরূপ, পরিবর্তে এটি সদৃশ হিসাবে পতাকাঙ্কিত করুন।
জ্যাক

11

সহজ বোঝার জন্য এই উদাহরণ বিবেচনা করুন।

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

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

এখন, সংস্থাটি তাদের গ্রাহককে তাদের পণ্যগুলির একটি বান্ডিল অর্থাৎ ব্রডব্যান্ড, ফোন লাইন এবং মোবাইল পুরোপুরি সরবরাহ করতে চায় এবং এখানে আসে অ্যাবস্ট্রাক্ট কারখানাটি খেলতে।

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

এই ক্ষেত্রে, এটি BundleFactoryবিমূর্ত কারখানা BroadbandFactory, PhonelineFactoryএবং MobileFactoryহয় Factory। আরও সরলকরণের জন্য, এই কারখানাগুলিতে থাকবে স্বতন্ত্র পণ্যগুলির সূচনা করার জন্য কারখানার পদ্ধতি

নীচের কোড নমুনা দেখুন:

public class BroadbandFactory : IFactory {
    public static Broadband CreateStandardInstance() {
        // broadband product creation logic goes here
    }
}

public class PhonelineFactory : IFactory {
    public static Phoneline CreateStandardInstance() {
        // phoneline product creation logic goes here
    }
}

public class MobileFactory : IFactory {
    public static Mobile CreateStandardInstance() {
        // mobile product creation logic goes here
    }
}

public class BundleFactory : IAbstractFactory {

    public static Bundle CreateBundle() {
        broadband = BroadbandFactory.CreateStandardInstance();
        phoneline = PhonelineFactory.CreateStandardInstance();
        mobile = MobileFactory.CreateStandardInstance();

        applySomeDiscountOrWhatever(broadband, phoneline, mobile);
    }

    private static void applySomeDiscountOrWhatever(Broadband bb, Phoneline pl, Mobile m) {
        // some logic here
        // maybe manange some variables and invoke some other methods/services/etc.
    }
}

আশাকরি এটা সাহায্য করবে.


1
staticকোনও জিওএফ কারখানার প্যাটার্নে কোনও পদ্ধতি নেই । এটা ভুল.
jaco0646

5

বাস্তব জীবনের উদাহরণ। (মনে রাখা সহজ)

কারখানা

কল্পনা করুন যে আপনি একটি বাড়ি তৈরি করছেন এবং আপনি একটি দরজার জন্য ছুতার কাছে যান। আপনি দরজা এবং আপনার প্রয়োজনীয়তার জন্য পরিমাপ দিন এবং তিনি আপনার জন্য একটি দরজা তৈরি করবেন। এই ক্ষেত্রে, ছুতার দরজার একটি কারখানা। আপনার নির্দিষ্টকরণগুলি কারখানার জন্য ইনপুট এবং দরজাটি কারখানার আউটপুট বা পণ্য।

বিমূর্ত কারখানা

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

আমি এখানে কারখানার পদ্ধতি প্যাটার্ন এবং বিমূর্ত কারখানার প্যাটার্ন উভয়ই এখানে ব্যাখ্যা করেছি যে তাদের সমস্যাগুলি ব্যাখ্যা না করে এবং তারপরে উপরের নিদর্শনগুলি ব্যবহার করে সমস্যাগুলি সমাধান করুন https://github.com/vikramnagineni/ ডিজাইন- প্যাটার্নস / ট্রিরি / মাস্টার


3

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


3

প্রেরণাগুলি মধ্যে পার্থক্য বুঝতে:

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

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

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

এই উপরোক্ত মামলাগুলি অ্যাবস্ট্রাক্ট ফ্যাক্টরি প্যাটার্নের মৌলিক প্রয়োজনীয়তা তৈরি করে ।

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

কয়েকটি নোট:

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

কোডের উদাহরণ:

//Part of framework-code
BoardGame {
    Board createBoard() //factory method. Default implementation can be provided as well
    Piece createPiece() //factory method

    startGame(){        //template method
         Board borad = createBoard()
         Piece piece = createPiece()
         initState(board, piece)
    }
}


//Part of Tool-builder code
Ludo inherits  BoardGame {
     Board createBoard(){ //overriding of factory method
         //Option A: return new LudoBoard() //Lodu knows object creation
         //Option B: return LudoFactory.createBoard() //Lodu asks AbstractFacory
     }
….
}

//Part of Tool-builder code
Chess inherits  BoardGame {
    Board createBoard(){ //overriding of factory method
        //return a Chess board
    }
    ….
}

3
  1. আমার প্রথম প্রশ্নটি বিমূর্ত কারখানা সম্পর্কে। এর ভূমিকা কি আপনাকে কেবল একটি একক কংক্রিট অবজেক্টের চেয়ে কংক্রিটের অবজেক্টগুলির পরিবার তৈরি করতে দেয় (এটি আপনি কোন নির্দিষ্ট কারখানার উপরে নির্ভর করতে পারেন)?

হ্যাঁ. অ্যাবস্ট্রাক্ট কারখানার উদ্দেশ্য:

সম্পর্কিত বা নির্ভরশীল বস্তুর পরিবারগুলি তাদের কংক্রিটের ক্লাসগুলি নির্দিষ্ট না করে তৈরি করার জন্য একটি ইন্টারফেস সরবরাহ করুন।


  1. বিমূর্ত কারখানাটি কি কোনও পদ্ধতির উপর নির্ভর করে কেবল একটি খুব বড় অবজেক্ট বা অনেকগুলি বস্তু ফেরত দেয়?

আদর্শভাবে এটি ক্লায়েন্টের যে পদ্ধতিতে অনুরোধ করা হচ্ছে তার প্রতি একটি বস্তু ফেরত দেওয়া উচিত।

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

হ্যাঁ. কারখানার পদ্ধতিতে উত্তরাধিকার ব্যবহৃত হয়।

  1. অ্যাবস্ট্রাক্ট ফ্যাক্টরি প্যাটার্ন কম্পোজিশনের মাধ্যমে অন্য কোনও বস্তুর কাছে অবজেক্ট ইনস্ট্যান্টেশনের দায়িত্ব অর্পণ করে? এটার মানে কি?

অ্যাস্ট্রাক্টফ্যাক্টরি একটি ফ্যাক্টরিমাথোড সংজ্ঞায়িত করে এবং কংক্রিটফ্যাক্টরি একটি কংক্রিটপ্রোডাক্ট তৈরির জন্য দায়ী। শুধু এই কোড কোড মাধ্যমে অনুসরণ করুন নিবন্ধে

সম্পর্কিত এসই পোস্টগুলিতে আপনি আরও বিশদ জানতে পারবেন:

কারখানা এবং বিমূর্ত কারখানার প্যাটার্নগুলির মধ্যে মূল পার্থক্য কী?

নকশার প্যাটার্নস: ফ্যাক্টরী বনাম কারখানা পদ্ধতি বনাম বিমূর্ত কারখানা


3

কারখানার পদ্ধতি উত্তরাধিকারের উপর নির্ভর করে: অবজেক্ট সৃজনটি সাবক্লাসে অর্পণ করা হয়, যা বস্তু তৈরির জন্য কারখানার পদ্ধতি প্রয়োগ করে।

বিমূর্ত কারখানা অবজেক্ট কম্পোজিশনের উপর নির্ভর করে: ফ্যাক্টরি ইন্টারফেসে উদ্ভাসিত পদ্ধতিতে অবজেক্ট ক্রিয়েশন প্রয়োগ করা হয়।

কারখানা এবং বিমূর্ত কারখানার প্যাটার্নের উচ্চ স্তরের চিত্র

নকশা

কারখানা পদ্ধতি সম্পর্কে আরও তথ্যের জন্য, এই নিবন্ধটি পড়ুন ।

বিমূর্ত কারখানা পদ্ধতি সম্পর্কে আরও তথ্যের জন্য, এই নিবন্ধটি দেখুন


2

এটি সর্বনিম্ন ইন্টারফেসের সাথে খুব সহজ করে তুলতে এবং দয়া করে "// 1" ফোকাস করুন:

class FactoryProgram
    {
        static void Main()
        {
            object myType = Program.MyFactory("byte");
            Console.WriteLine(myType.GetType().Name);

            myType = Program.MyFactory("float"); //3
            Console.WriteLine(myType.GetType().Name);

            Console.ReadKey();
        }

        static object MyFactory(string typeName)
        {
            object desiredType = null; //1
            switch (typeName)
            {
                case "byte": desiredType = new System.Byte(); break; //2
                case "long": desiredType = new System.Int64(); break;
                case "float": desiredType = new System.Single(); break;
                default: throw new System.NotImplementedException();
            }
            return desiredType;
        }
    }

এখানে গুরুত্বপূর্ণ বিষয়গুলি: 1. কারখানা ও অ্যাবস্ট্রাকফ্যাক্টরি প্রক্রিয়াগুলিকে অবশ্যই উত্তরাধিকার (সিস্টেম.অজেক্ট-> বাইট, ভাসমান ...) ব্যবহার করা উচিত; সুতরাং যদি আপনার প্রোগ্রামে উত্তরাধিকার থাকে তবে কারখানাটি (অ্যাবস্ট্রাক্ট ফ্যাক্টরি সর্বাধিক সম্ভবত সেখানে থাকবে না) ইতিমধ্যে নকশা 2 উপস্থিত রয়েছে Creator বিমূর্ত কারখানায় রিটার্নের ধরণটি একটি ইন্টারফেস হবে।

interface IVehicle { string VehicleName { get; set; } }
interface IVehicleFactory
    {
        IVehicle CreateSingleVehicle(string vehicleType);
    }
class HondaFactory : IVehicleFactory
    {
        public IVehicle CreateSingleVehicle(string vehicleType)
        {
            switch (vehicleType)
            {
                case "Sports": return new SportsBike();
                case "Regular":return new RegularBike();
                default: throw new ApplicationException(string.Format("Vehicle '{0}' cannot be created", vehicleType));
            }
        }
    }
class HeroFactory : IVehicleFactory
    {
        public IVehicle CreateSingleVehicle(string vehicleType)
        {
            switch (vehicleType)
            {
                case "Sports":  return new SportsBike();
                case "Scooty": return new Scooty();
                case "DarkHorse":return new DarkHorseBike();
                default: throw new ApplicationException(string.Format("Vehicle '{0}' cannot be created", vehicleType));
            }
        }
    }

class RegularBike : IVehicle { public string VehicleName { get { return "Regular Bike- Name"; } set { VehicleName = value; } } }
class SportsBike : IVehicle { public string VehicleName { get { return "Sports Bike- Name"; } set { VehicleName = value; } } }
class RegularScooter : IVehicle { public string VehicleName { get { return "Regular Scooter- Name"; } set { VehicleName = value; } } }
class Scooty : IVehicle { public string VehicleName { get { return "Scooty- Name"; } set { VehicleName = value; } } }
class DarkHorseBike : IVehicle { public string VehicleName { get { return "DarkHorse Bike- Name"; } set { VehicleName = value; } } }

class Program
{
    static void Main(string[] args)
    {
        IVehicleFactory honda = new HondaFactory(); //1
        RegularBike hondaRegularBike = (RegularBike)honda.CreateSingleVehicle("Regular"); //2
        SportsBike hondaSportsBike = (SportsBike)honda.CreateSingleVehicle("Sports");
        Console.WriteLine("******* Honda **********"+hondaRegularBike.VehicleName+ hondaSportsBike.VehicleName);

        IVehicleFactory hero = new HeroFactory();
        DarkHorseBike heroDarkHorseBike = (DarkHorseBike)hero.CreateSingleVehicle("DarkHorse");
        SportsBike heroSportsBike = (SportsBike)hero.CreateSingleVehicle("Sports");
        Scooty heroScooty = (Scooty)hero.CreateSingleVehicle("Scooty");
        Console.WriteLine("******* Hero **********"+heroDarkHorseBike.VehicleName + heroScooty.VehicleName+ heroSportsBike.VehicleName);

        Console.ReadKey();
    }
}

গুরুত্বপূর্ণ বিষয়: 1. প্রয়োজনীয়তা: হন্ডা "নিয়মিত", "ক্রীড়া" তৈরি করবে তবে হিরো "ডার্কহর্স", "স্পোর্টস" এবং "স্কুটি" তৈরি করবে। ২. দুটি ইন্টারফেস কেন? একটি প্রস্তুতকারকের ধরণের (আইভিহিকলফ্যাক্টরি) এবং অন্যটি পণ্য কারখানার জন্য (আইভিহিকল); 2 ইন্টারফেস বোঝার অন্যান্য উপায় হ'ল বিমূর্ত কারখানা সম্পর্কিত সম্পর্কিত বস্তুগুলি তৈরি করা 2 The ধরা পড়ে আইভিহিকলফ্যাক্টরির বাচ্চাদের ফিরে আসা এবং আইভিহিকল (কারখানায় কংক্রিটের পরিবর্তে); সুতরাং আমি প্যারেন্ট ভেরিয়েবল (আইভিহিকল) পাই; তারপরে আমি ক্রিয়েটসিংহেলকে কল করে প্রকৃত কংক্রিটের ধরণ তৈরি করি এবং তারপরে অভিভাবক বস্তুকে প্রকৃত শিশু অবজেক্টে কাস্ট করে। আমি কি করলে কি হবে RegularBike heroRegularBike = (RegularBike)hero.CreateSingleVehicle("Regular");; আপনি অ্যাপ্লিকেশনএক্সেপশন পাবেন এবং এজন্য আমাদের জেনেরিক অ্যাবস্ট্রাক্ট ফ্যাক্টরি দরকার যা প্রয়োজনে আমি ব্যাখ্যা করব।


1

বিমূর্ত কারখানা : কারখানার একটি কারখানা; এমন একটি কারখানা যা পৃথক কিন্তু সম্পর্কিত / নির্ভর কারখানাগুলি তাদের কংক্রিটের ক্লাসগুলি নির্দিষ্ট না করে এক সাথে গোষ্ঠী করে। বিমূর্ত কারখানার উদাহরণ

কারখানা : এটি শিশু ক্লাসগুলিতে ইনস্ট্যান্টেশন যুক্তি যুক্ত করার একটি উপায় সরবরাহ করে। কারখানার প্যাটার্ন উদাহরণ


0

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


0

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


এটি সঠিক নয়। এটি সর্বত্র প্রচলিত একটি ভুল ধারণা যে অ্যাবস্ট্রাক্ট ফ্যাক্টরি কারখানার কারখানা ছাড়া আর কিছুই নয়।
jaco0646

0

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

যেমনটি জিওএফ যথাযথভাবে বলেছে: অ্যাবস্ট্রাক্ট ফ্যাক্টরি তাদের কংক্রিটের ক্লাসগুলি নির্দিষ্ট করে না দিয়ে সম্পর্কিত বা নির্ভরশীল জিনিসের পরিবার তৈরির জন্য একটি ইন্টারফেস সরবরাহ করে।

        public class Client {
            public static void main(String[] args) {
               ZooFactory zooFactory = new HerbivoreZooFactory();       
               Animal animal1 = zooFactory.animal1();
               Animal animal2 = zooFactory.animal2();
               animal1.sound();
               animal2.sound();

               System.out.println();

               AnimalFactory animalFactory = new CowAnimalFactory();
               Animal animal = animalFactory.createAnimal();
               animal.sound();
            }
        }

        public interface Animal {
            public void sound();
        }

        public class Cow implements Animal {

            @Override
            public void sound() {
                System.out.println("Cow moos");
            }

        }

        public class Deer implements Animal {

            @Override
            public void sound() {
                System.out.println("Deer grunts");
            }

        }

        public class Hyena implements Animal {

            @Override
            public void sound() {
                System.out.println("Hyena.java");
            }

        }

        public class Lion implements Animal {

            @Override
            public void sound() {
                System.out.println("Lion roars");
            }

        }

        public interface ZooFactory {
            Animal animal1();

            Animal animal2();
        }

        public class CarnivoreZooFactory implements ZooFactory {

            @Override
            public Animal animal1() {
                return new Lion();
            }

            @Override
            public Animal animal2() {
                return new Hyena();
            }

        }

        public class HerbivoreZooFactory implements ZooFactory{

            @Override
            public Animal animal1() {
                return new Cow();
            }

            @Override
            public Animal animal2() {
                return new Deer();
            }

        }

        public interface AnimalFactory {
            public Animal createAnimal();
        }

        public class CowAnimalFactory implements AnimalFactory{

            @Override
            public Animal createAnimal() {
                return new Cow();
            }

        }

        public class DeerAnimalFactory implements AnimalFactory{

            @Override
            public Animal createAnimal() {
                return new Deer();
            }

        }

        public class HyenaAnimalFactory implements AnimalFactory{

            @Override
            public Animal createAnimal() {
                return new Hyena();
            }

        }

        public class LionAnimalFactory implements AnimalFactory{

            @Override
            public Animal createAnimal() {
                return new Lion();
            }

        }

এটি সঠিক নয়। এই কোডটি সর্বত্র প্রচলিত ভুল ধারণাটি কার্যকর করে যে অ্যাবস্ট্রাক্ট ফ্যাক্টরি কারখানার কারখানা ছাড়া আর কিছুই নয়।
jaco0646

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

কারখানার পদ্ধতিতে সাব-ক্লাসিংয়ের মাধ্যমে উত্তরাধিকারের দিকে মনোনিবেশ করা হয়, কারণ কারখানা পদ্ধতিটি টেম্পলেট পদ্ধতি প্যাটার্নের একটি বিশেষীকরণ। উপরে শীর্ষে ভোট দেওয়া উত্তর একটি শালীন কোড উদাহরণ দেখায়।
jaco0646

@ জ্যাকো06466. ১. এর অর্থ কি এই যে উপরোক্ত উদাহরণস্বরূপ, অ্যানিমাল ফ্যাক্টরির জন্য ইন্টারফেস ব্যবহার করার পরিবর্তে এবং এর প্রয়োগগুলি সরবরাহ করার পরিবর্তে আমার একটি শ্রেণি ব্যবহার করা উচিত ছিল এবং তার উপক্লাসে ক্রিয়েট অ্যানিমাল () পদ্ধতিটি ওভাররাইড করা উচিত ছিল: CowAnimalF কারিগর, লায়নআনিমাল ফ্যাক্টরি ইত্যাদি। ?? ২. এছাড়াও, চিড়িয়াখানার জন্য প্রদর্শিত উদাহরণ সম্পর্কে আপনার চিন্তা কি ??
যতীন শাশু

প্রথম প্রশ্নের জন্য: হ্যাঁ। দ্বিতীয়টিতে, আমি প্রতিটি স্বতন্ত্র উত্তরের সমালোচনা চালিয়ে যাওয়ার চেয়ে এই থ্রেডটিতে আমার নিজের উত্তর যুক্ত করেছি।
jaco0646
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.