JavaRush /جاوا بلاگ /Random-SD /ليول 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