আমি সাবলীল এপিটিকে এটির নিজের "বিল্ডার" শ্রেণীর দ্বারা তৈরি করা বস্তু থেকে পৃথক করে রাখতে চাই। এইভাবে, ক্লায়েন্ট যদি সাবলীল এপিআই ব্যবহার করতে না চান তবে আপনি এটি নিজে নিজে ব্যবহার করতে পারেন এবং এটি ডোমেন অবজেক্টকে দূষিত করে না (একক দায়িত্বের নীতিটি মেনে চলা)। এক্ষেত্রে নিম্নলিখিতটি তৈরি করা হবে:
Car
যা ডোমেন অবজেক্ট
CarBuilder
যা সাবলীল এপিআই রাখে
ব্যবহারটি এরকম হবে:
var car = CarBuilder.BuildCar()
.OfBrand(Brand.Ford)
.OfModel(12345)
.PaintedIn(Color.Silver)
.Build();
CarBuilder
বর্গ (আমি সি # নামকরণ কনভেনশন এখানে ব্যবহার করছি) এই মত দেখাবে:
public class CarBuilder {
private Car _car;
/// Constructor
public CarBuilder() {
_car = new Car();
SetDefaults();
}
private void SetDefaults() {
this.OfBrand(Brand.Ford);
// you can continue the chaining for
// other default values
}
/// Starts an instance of the car builder to
/// build a new car with default values.
public static CarBuilder BuildCar() {
return new CarBuilder();
}
/// Sets the brand
public CarBuilder OfBrand(Brand brand) {
_car.SetBrand(brand);
return this;
}
// continue with OfModel(...), PaintedIn(...), and so on...
// that returns "this" to allow method chaining
/// Returns the built car
public Car Build() {
return _car;
}
}
মনে রাখবেন যে এই শ্রেণিটি থ্রেড নিরাপদে থাকবে না (প্রতিটি থ্রেডের নিজস্ব কারবিল্ডার উদাহরণ প্রয়োজন)। আরও মনে রাখবেন যে সাবলীল এপিআই সত্যিই দুর্দান্ত ধারণা হলেও এটি সাধারণ ডোমেন অবজেক্ট তৈরি করার উদ্দেশ্যে সম্ভবত ওভারকিল।
আপনি যদি আরও বিমূর্ত কিছুর জন্য একটি এপিআই তৈরি করে থাকেন এবং আরও জটিল সেটআপ এবং কার্যকর করেন তবে এই ইউনিট পরীক্ষা এবং ডিআই ফ্রেমওয়ার্কগুলিতে দুর্দান্ত কাজ করে যদি এই চুক্তিটি আরও কার্যকর। আপনি উইকিপিডিয়া ফ্লুয়েন্ট ইন্টারফেস নিবন্ধের জাভা বিভাগের অধীনে আরও কিছু উদাহরণ দেখতে পারেন যা দৃistance়তা, তারিখ পরিচালনা এবং মক অবজেক্টের সাথে রয়েছে।
সম্পাদনা করুন:
মতামত থেকে উল্লিখিত; আপনি বিল্ডার শ্রেণিটিকে একটি স্থিতিশীল অভ্যন্তর শ্রেণি তৈরি করতে পারেন (গাড়ির অভ্যন্তরে) এবং গাড়িটি অনাবৃত হতে পারে। গাড়িটিকে অপরিবর্তনীয় হতে দেওয়ার এই উদাহরণটি কিছুটা নির্বোধ বলে মনে হচ্ছে; তবে আরও জটিল সিস্টেমে যেখানে আপনি নির্মিত অবজেক্টের সামগ্রীগুলি একেবারে পরিবর্তন করতে চান না, আপনি এটি করতে চাইবেন want
স্থিতিশীল অভ্যন্তর শ্রেণি উভয়ই কীভাবে করা যায় এবং কীভাবে এটি অপসারণযোগ্য অবজেক্ট তৈরি করতে পারে তা হ'ল তার উদাহরণ নীচে:
// the class that represents the immutable object
public class ImmutableWriter {
// immutable variables
private int _times; private string _write;
// the "complex" constructor
public ImmutableWriter(int times, string write) {
_times = times;
_write = write;
}
public void Perform() {
for (int i = 0; i < _times; i++) Console.Write(_write + " ");
}
// static inner builder of the immutable object
protected static class ImmutableWriterBuilder {
// the variables needed to construct the immutable object
private int _ii = 0; private string _is = String.Empty;
public void Times(int i) { _ii = i; }
public void Write(string s) { _is = s; }
// The stuff is all built here
public ImmutableWriter Build() {
return new ImmutableWriter(_ii, _is);
}
}
// factory method to get the builder
public static ImmutableWriterBuilder GetBuilder() {
return new ImmutableWriterBuilder();
}
}
ব্যবহার নিম্নলিখিত হবে:
var writer = ImmutableWriter
.GetBuilder()
.Write("peanut butter jelly time")
.Times(2)
.Build();
writer.Perform();
// console writes: peanut butter jelly time peanut butter jelly time
সম্পাদনা 2: মন্তব্যগুলিতে পিট জটিল ডোমেন অবজেক্টের সাথে ইউনিট টেস্ট লেখার প্রসঙ্গে ল্যাম্বডা ফাংশন সহ বিল্ডারদের ব্যবহার সম্পর্কে ব্লগ পোস্ট করেছে । বিল্ডারটিকে আরও কিছুটা ভাবপূর্ণ করার জন্য এটি একটি আকর্ষণীয় বিকল্প।
ক্ষেত্রে CarBuilder
আপনি যদি এর পরিবর্তে এই পদ্ধতি আছে প্রয়োজন:
public static Car Build(Action<CarBuilder> buildAction = null) {
var carBuilder = new CarBuilder();
if (buildAction != null) buildAction(carBuilder);
return carBuilder._car;
}
যা এটি হিসাবে ব্যবহার করা যেতে পারে:
Car c = CarBuilder
.Build(car =>
car.OfBrand(Brand.Ford)
.OfModel(12345)
.PaintedIn(Color.Silver);
var car = new Car(Brand.Ford, 12345, Color.Silver);
?