Factory
Фабрикалық проектілеудің шаблоны объектілерді жасаған кезде, оның логикасын клиентке түсіндермеуге мүмкіндік береді.Мысалға, сіз банкте жұмыс жасайсыз. Банкке қаржы құралдарын жасап шығару керек дейік.
Factory классын жасап, оған әртүрлі объектілердің жасалуына жауап беретін әдіс береміз:
public class ProductFactory {
public static Product createProduct(String name) {
switch(name){
case "loan": return new Loan();
case "stock": return new Stock();
case "bond": return new Bond();
default: throw new RuntimeException("No such product " + name);
}
}
}
Бұл жердегі Loan, Stock және Bond - Product-тың подтиптары болып табылады. Метод createProduct әдісі әрбір жасалған құрал үшін қосымша логикасы болуы мүмкін. Бірақ бұның басты пайдасы клиентке объектілердің конструкторлары мен конфигурацияларын көрсетпей-ақ жасайды. Осының арқасында клиент үшін құралдарды мына түрде жасай аламыз:
Product p = ProductFactory.createProduct("loan");
ИСПОЛЬЗОВАНИЕ ЛЯМБДА ВЫРАЖЕНИЙ 5
3 тарауда көргендей, әдістерге сілтеме жасағандай, конструкторларға да сілтеме жасауға болады.
Loan конструкторына сілтеме жасау:
Supplier
loanSupplier = Loan::new;
Loan loan = loanSupplier.get();
Осы техниканы қолдана отыра, құралдың конструкторында оның атын көрсететін карта жасап, алдыңғы кодты көшіріп алуға болады:
final static Map> map = new HashMap<>();
static {
map.put("loan", Loan::new);
map.put("stock", Stock::new);
map.put("bond", Bond::new);
}
Картаны әртүрлі құралдардың көшірмелерін жасау үшін пайдалануға болады: public static Product createProduct(String name){
Supplier
p = map.get(name);
if(p != null) return p.get();
throw new IllegalArgumentException("No such product " + name);
}
Бұл әдіс Java 8 функцияласын қолдана отырып, фабрика шаблонының нәтижесіне жетуге болады. Бірақ бұл әдісті Егер фабрикалық әдіс create-Product конструкторды беру үшін бірнеше аргумент қабылдаса, бұл әдіс масштабтауда көмегі нашар. Сол себептен қарапайым Supplier басқа функциональды интерфейс беру керек.
Мысалға, үш аргумент(екі бүтін сан және тіркес) қабылдайтын құралдың конструкторын шақыру үшін арнайы TriFunction функциональды интерфейсін жасау қажет. Нәтижесінде карта кейпі қиындау болады:
public interface TriFunction {
R apply(T t, U u, V v);
}
Map> map
= new HashMap<>();
Достарыңызбен бөлісу: |