JavaRush /جاوا بلاگ /Random-UR /لیول 37۔ لیول کے موضوع پر انٹرویو کے سوالات کے جوابات
lichMax
سطح
Санкт-Петербург

لیول 37۔ لیول کے موضوع پر انٹرویو کے سوالات کے جوابات

گروپ میں شائع ہوا۔
ہیلو. ایک بار پھر، مجھے ان سوالات کے جوابات نہیں ملے۔ میں نے اپنے لیے مرتب کردہ جوابات پوسٹ کرنے کا فیصلہ کیا۔ لیول 37۔ لیول - 1 کے موضوع پر انٹرویو کے سوالات کے جواباتاصل سوالات یہ ہیں: انٹرویو کے لیے سوالات:
  1. ڈیزائن پیٹرن کیا ہیں؟
  2. آپ کون سے ڈیزائن پیٹرن جانتے ہیں؟
  3. سنگلٹن پیٹرن کے بارے میں بتائیں؟ اس دھاگے کو محفوظ کیسے بنایا جائے؟
  4. ہمیں فیکٹری پیٹرن کے بارے میں بتائیں؟
  5. ہمیں AbstractFactory پیٹرن کے بارے میں بتائیں
  6. ہمیں اڈپر پیٹرن کے بارے میں بتائیں، ریپر سے اس کے فرق؟
  7. ہمیں پراکسی پیٹرن کے بارے میں بتائیں
  8. ایک تکرار کنندہ کیا ہے؟ تکرار کنندہ سے متعلق کون سے انٹرفیس آپ جانتے ہیں؟
  9. ہمیں Arrays کلاس کی ضرورت کیوں ہے؟
  10. ہمیں کلیکشن کلاس کی ضرورت کیوں ہے؟
میرے جوابات یہ ہیں: میرے جوابات:
  1. ڈیزائن پیٹرن اچھی طرح سے قائم ہیں، سب سے زیادہ عام مسائل کے کامیاب حل ہیں جو پروگراموں یا ان کے حصوں کے ڈیزائن اور ترقی کے دوران پیدا ہوتے ہیں.

  2. Singleton, Factory, Abstract Factory, Template method, Strategy, Pool, Adapter, Proxy, Bridge, MVC.

  3. جب آپ کو کسی پروگرام میں موجود کلاس کی صرف ایک مثال کی ضرورت ہوتی ہے، تو پیٹرن استعمال ہوتا ہے Singleton۔ یہ اس طرح لگتا ہے (سست آغاز):

    clas Singleton {
    	private Singleton instance;
    
    	private Singleton() {}
    
    	public static Singletot getInstance() {
    		if (instance == null)
    			instance = new Singleton();
    		return instance;
    	}
    }

    تھریڈ کو محفوظ بنانے کے لیے، آپ طریقہ میں getInstance()ایک ترمیم کنندہ شامل کر سکتے ہیں synchronized۔ لیکن یہ بہترین حل نہیں ہوگا (بلکہ آسان ترین)۔ ایک بہت بہتر حل یہ ہے کہ طریقہ کو getInstanceاس طرح لکھیں (ڈبل چیک شدہ لاکنگ):

    public static synchronized Singleton getInstance() {
    	if (instance == null)
    		synchronized(Singleton.class) {
    			instance = new Singleton();
    		}
    	return instance;
    }

  4. ایک پیٹرن Factoryایک تخلیقی پیٹرن ہے. یہ آپ کو طلب پر اشیاء بنانے کی اجازت دیتا ہے (مثال کے طور پر، کچھ شرائط کے تحت)۔ ایسا لگتا ہے:

    class Factory{
    	public static Object1 getObject1() {
    		return new Object1();
    	}
    
    	public static Object2 getObject2() {
    		return new Object2();
    	}
    
    	public static Object3 getObject3() {
    		return new Object3();
    	}
    }

    اس پیٹرن کی ایک تبدیلی بھی ہے جسے کہا جاتا ہے FactoryMethod۔ اس پیٹرن کے مطابق، آنے والے ان پٹ ڈیٹا (پیرامیٹر ویلیوز) پر منحصر ہے، مختلف اشیاء ایک طریقے سے بنائی جاتی ہیں۔ ان تمام اشیاء کا ایک مشترکہ اجداد (یا ایک مشترکہ قابل عمل انٹرفیس) ہونا ضروری ہے۔ ایسا لگتا ہے:

    class FactoryMethod {
    	public enum TypeObject {
    		TYPE1,
    		TYPE2,
    		TYPE3
    	}
    
    	public static CommonClass getObject(TypeObject type) {
    		switch(type) {
    			case TYPE1:
    				return new Object1();
    			case TYPE2:
    				return new Object2();
    			case TYPE3:
    				return new Object3();
    			default:
    				return null;
    		}
    	}
    }

    کلاسز Object1، Object2اور Object3کلاس سے وراثت حاصل کریں CommonClass۔

  5. ایک پیٹرن Abstract Factoryایک تخلیقی ڈیزائن پیٹرن بھی ہے. اس پیٹرن کے مطابق، ایک تجریدی فیکٹری بنائی جاتی ہے جو کئی کنکریٹ فیکٹریوں کے لیے ایک ٹیمپلیٹ کے طور پر کام کرتی ہے۔ یہاں ایک مثال ہے:

    class Human {}
    
    class Boy extends Human {}
    class TeenBoy extends Human {}
    class Man extends Human {}
    class OldMan extends Human {}
    
    class Girl extends Human {}
    class TeenGirl extends Human {}
    class Woman extends Human {}
    class OldWoman extends Human {}
    
    interface AbstractFactory {
    	Human getPerson(int age);
    }
    
    class FactoryMale implements AbstractFactory {
    	public Human getPerson(int age) {
    		if (age < 12)
    			return new Boy();
    		if (age >= 12 && age <= 20)
    			return new TeenBoy();
    		if (age > 20 && age < 60)
    			return new Man();
    		return new OldMan();
    	}
    }
    
    сlass FactoryFemale implements AbstractFactory {
    	public Human getPerson(int age) {
    		if (age < 12)
    			return new Girl();
    		if (age >= 12 && age <= 20)
    			return new TeenGirl();
    		if (age > 20 && age < 60)
    			return new Woman();
    		return new OldWoman();
    	}
    }

  6. ایک پیٹرن Adapterایک ساختی پیٹرن ہے. اس کا نفاذ ایک قسم کی چیز کو استعمال کرنے کی اجازت دیتا ہے جہاں دوسری قسم کی چیز کی ضرورت ہوتی ہے (عام طور پر تجریدی اقسام)۔ اس پیٹرن کے نفاذ کی ایک مثال:

    interface TotalTime {
    	int getTotalSeconds();
    }
    interface Time {
    	int getHours();
    	int getMinutes();
    	int getSeconds();
    }
    
    class TimeAdapter extends TotalTime {
    	private Time time;
    	public TimeAdapter(Time time) {
    		this.time = time;
    	}
    	public int getTotalTime() {
    		return time.getSeconds + time.getMinutes * 60 + time.getHours * 60 * 60;
    	}
    }
    
    class TotalTimeAdapter extends Time {
    	private TotalTime totalTime;
    	public TotalTimeAdapter(TotalTime totalTime) {
    		this.totalTime = totalTime;
    	}
    
    	public int getSeconds() {
    		return totalTime % 60;
    	}
    
    	public int getMinutes() {
    		return (totalTime / 60) % 60;
    	}
    
    	public int getHours() {
    		return totaltime/ (60 * 60) ;
    	}
    }
    
    class Main {
    	public static void main(String[] args) {
    		Time time = new Time() {
    			public int getSeconds() {
    				return LocalTime.now().getSecond();
    			}
    
    			public int getMinutes() {
    				return LocalTime.now().getMinute();
    			}
    
    			public int getHours() {
    				return LocalTime.now().getHour() ;
    			}
    		};
    
    		TotalTime totalTime = new TimeAdapter(time);
    		System.out.println(totalTime.getTotalSeconds());
    
    		TotalTime totalTime2 = new TotalTime() {
    			public int getTotalSeconds() {
    				LocalTime currTime = LocalTime.now();
    				return currTime.getSecond() + currTime.getMinute * 60 + currTime.getHour * 60 * 60;
    			}
    		};
    
    		Time time2 = new TotalTimeAdapter(totalTime2);
    		System.out.println(time2.getHours + ":" + time2.getMinutes() + ":" + time2.getSeconds());
    	}
    }

    При реализации паттерна Wrapper создаётся класс, который оборачивает исходный класс и реализует тот же интерфейс, который реализует исходный класс. Таким образом, это позволяет расширить функциональность исходного класса и использовать новый класс там, где ожидается использование исходного класса. Это отличается от реализации паттерна Adapter тем, что в данном случае используется один интерфейс (тот же, что есть у исходного класса). В паттерне Adapter же используется два интерфейса, и класс, который оборачивает экземпяр исходного класса, реализует совсем другой инферфейс, не интерфейс исходного класса.

  7. Паттерн Proxy — это структурный паттерн проектирования. Он нужен для того, чтобы контролировать доступ к Howому-то an objectу. Для этого пишется класс по типу "обёртка", то есть внутрь класса передаётся исходный an object, реализующий некий интерфейс, сам класс тоже реализует этот интерфейс, и в каждом методе этого класса вызывается похожий метод у исходного an object. Реализация того же интерфейса, что и у исходного an object, позволяет подменить исходный an object прокси-an objectом. Также это позволяет, не меняя исходного an object, "навешивать" на его методы Howую-то специальную дополнительную функциональность (например, логирование, проверка прав доступа, кэширование и т.д.). Пример:

    interface Bank {
    	void setUserMoney(User user, double money);
    	double getUserMoney(User user);
    }
    
    class CitiBank implements Bank { //оригинальный класс
    	public void setUserMoney(User user, double money) {
    		UserDAO.update(user,money);
    	}
    
    	public double getUserMoney(User user) {
    		UserDAO.getUserMoney(user);
    	}
    }
    
    class SecurityProxyBank implements Bank {
    	private Bank bank;
    
    	public SecurityProxyBank(Bank bank) {
    		this.bank = bank;
    	}
    
    	public void setUserMoney(User user, double money) {
    		if (!SecurityManager.authorize(user,BankAccounts.Manager)
    			throw new SecurityException("User can't change money value");
    
    		UserDAO.update(user,money);
    	}
    
    	public double getUserMoney(User user) {
    		if (!SecurityManager.authorize(user,BankAccounts.Manager)
    			throw new SecurityException("User can't get money value");
    
    		UserDAO.getUserMoney(user);
    	}

  8. Итератор — это специальный внутренний an object коллекции, который позволяет последовательно перебирать элементы этой коллекций. Этот an object должен реализовывать интерфейс Iterator<E>, либо ListIterator<E> (для списков). Также, для того, чтобы перебирать элементы коллекции, коллекция должна поддерживать интерфейс Iterable<E>. Интерфейс Iterable<E> содержит всего один метод — iterator(), который позволяет извне получить доступ к итератору коллекции.

    Интерфейс Iterator<E> содержит следующие методы:

    • boolean hasNext() — проверяет, есть ли в коллекции ещё Howой-то элемент

    • E next() — позволяет получить очередной элемент коллекции (после получения element, внутренний курсор итератора передвигается на следующий элемент коллекции)

    • void remove() — удаляет текущий элемент из коллекции

    Интерфейс же ListIterator<E> содержит такие методы:

    • boolean hasNext() — проверяет, существуют ли ещё один элемент в коллекции (следующий за текущим)

    • E next() — возвращает очередной элемент коллекции (и передвигает внутренний курсок итератора на следующий элемент)

    • int nextIndex() — возвращает индекс следующего element

    • void set(E e) — устанавливает meaning текущего element void add(E e). Добавляет элемент в конец списка.

    • boolean hasPrevious() — проверяет, существует ли Howой-то элемент в коллекции перед данным элементом

    • E previous() — возвращает текущий элемент коллекции и переводит курсор на предыдущий элемент коллекции

    • int previousIndex — возвращает индекс предыдущего element коллекции

    • void remove() — удаляет текущий элемент коллекции

    • void add(E e) — добавляет элемент e после текущего element коллекции

  9. کلاس Arraysایک افادیت کی کلاس ہے جو مختلف صفوں کی ہیرا پھیری کے لیے ڈیزائن کی گئی ہے۔ اس کلاس میں ایک صف کو فہرست میں تبدیل کرنے، ایک سرنی کے ذریعے تلاش کرنے، ایک سرنی کو کاپی کرنے، صفوں کا موازنہ کرنے، ایک سرنی ہیش کوڈ حاصل کرنے، ایک سٹرنگ کے طور پر کسی صف کی نمائندگی کرنے وغیرہ کے طریقے ہیں۔

  10. کلاس Collectionsکلیکشن کے ساتھ کام کرنے کے لیے ایک افادیت کی کلاس ہے۔ اس کلاس میں کسی مجموعے میں عناصر شامل کرنے، عناصر سے مجموعے کو بھرنے، مجموعے کو تلاش کرنے، مجموعے کی نقل کرنے، مجموعہ کا موازنہ کرنے، مجموعے کے زیادہ سے زیادہ اور کم سے کم عناصر کو تلاش کرنے کے طریقے ہیں، نیز مجموعہ کے مخصوص ترمیمات حاصل کرنے کے طریقے ہیں۔ معلوم اقسام (مثال کے طور پر، آپ دھاگے سے محفوظ مجموعہ یا ایک عنصر کے ساتھ ناقابل تغیر مجموعہ حاصل کر سکتے ہیں)۔

تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION