powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Friday pattern
79 сообщений из 79, показаны все 4 страниц
Friday pattern
    #38529391
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из за того что интерес к Пятничным задачкам остыл - предлагаю новую тему -

Пятничный Паттрен - и так мы берем по порядку - один паттрен на java из книги

http://vk.com/doc29055700_262036131] Design Patterns in Java Tutorial

И рассказываем о том как это паттерн применяется в обычной жизни ...
и совсем необязательно в программировании.

но пару пример где его нужно применить в коде - указать все таки нужно!

Для чего это нужно ?!
Таким образом я хочу для себя разобраться в Паттернах - понять где и как они применяются ,
уметь видеть их в коде и в жизни ...

Думаю эта тема будет полезна для всех кто только начал изучать java и кто уже потратил годы ...

Первый паттерн :

Factory Pattern


Shape.java

Код: java
1.
2.
3.
public interface Shape { 
 void draw(); 
} 



Rectangle.java
Код: java
1.
2.
3.
4.
5.
6.
7.
public class Rectangle implements Shape { 
 
 @Override 
 public void draw() { 
 System.out.println("Inside Rectangle::draw() method."); 
 } 
} 



Square.java
Код: java
1.
2.
3.
4.
5.
6.
7.
public class Square implements Shape { 
 
 @Override 
 public void draw() { 
 System.out.println("Inside Square::draw() method."); 
 } 
} 



Circle.java
Код: java
1.
2.
3.
4.
5.
6.
7.
public class Circle implements Shape { 
 
 @Override 
 public void draw() { 
 System.out.println("Inside Circle::draw() method."); 
 } 
}



ShapeFactory.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class ShapeFactory { 
 
 //use getShape method to get object of type shape 
 public Shape getShape(String shapeType){ 
 if(shapeType == null){ 
 return null; 
 } 
 if(shapeType.equalsIgnoreCase("CIRCLE")){ 
 return new Circle(); 
 } else if(shapeType.equalsIgnoreCase("RECTANGLE")){ 
 return new Rectangle(); 
 } else if(shapeType.equalsIgnoreCase("SQUARE")){ 
 return new Square(); 
 } 
 return null; 
 } 
} 



FactoryPatternDemo.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
public class FactoryPatternDemo { 
 
 public static void main(String[] args) { 
 ShapeFactory shapeFactory = new ShapeFactory(); 
 
 //get an object of Circle and call its draw method. 
 Shape shape1 = shapeFactory.getShape("CIRCLE"); 
 
 //call draw method of Circle 
 shape1.draw(); 
 
 //get an object of Rectangle and call its draw method. 
 Shape shape2 = shapeFactory.getShape("RECTANGLE"); 
 
 //call draw method of Rectangle 
 shape2.draw(); 
 
 //get an object of Square and call its draw method. 
 Shape shape3 = shapeFactory.getShape("SQUARE"); 
 
 //call draw method of circle 
 shape3.draw(); 
 } 
} 



Verify the output.

Код: java
1.
2.
3.
Inside Circle::draw() method. 
Inside Rectangle::draw() method. 
Inside Square::draw() method. 
...
Рейтинг: 0 / 0
Friday pattern
    #38529440
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начну Сам :

Антипаттерн – публикация this в конструкторе
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class ThisEscape { 
... 
 public ThisEscape(EventSource source) { 
     source.registerListener(new EventListener() { 
                   public void onEvent(Event e) { 
                        doSomething(e); 
               } 
           }); 
 ... 
 } 
} 


решение - использовать фабричный метод :

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class SafeListener { 
     private final EventListener listener; 
     private SafeListener() { 
         listener = new EventListener() { 
                 public void onEvent(Event e) { 
                doSomething(e); 
          } 
         }; 
  } 

 public static SafeListener newInstance(EventSource source) { 
   SafeListener safe = new SafeListener(); 
   source.registerListener(safe.listener); 
 return safe; 
 } 
} 
...
Рейтинг: 0 / 0
Friday pattern
    #38529489
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
public class FactoryPatternDemo { 
 
 public static void main(String[] args) { 
 ShapeFactory shapeFactory = new ShapeFactory(); 
 
 //get an object of Circle and call its draw method. 
 Shape shape1 = shapeFactory.getShape("CIRCLE"); 
 
 //call draw method of Circle 
 shape1.draw(); 
 
 //get an object of Rectangle and call its draw method. 
 Shape shape2 = shapeFactory.getShape("RECTANGLE"); 
 
 //call draw method of Rectangle 
 shape2.draw(); 
 
 //get an object of Square and call its draw method. 
 Shape shape3 = shapeFactory.getShape("SQUARE"); 
 
 //call draw method of circle 
 shape3.draw(); 
 } 
} 



А если у CIRCLE есть поле, например, радиус. То

Код: java
1.
2.
Circle shape1 = shapeFactory.getShape("CIRCLE"); 
shape1.getRadius();


и чем это лучше:

Код: java
1.
2.
Circle shape1 = new Circle(); 
shape1.getRadius();



???
...
Рейтинг: 0 / 0
Friday pattern
    #38529529
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892,

Думаю идея такая :

Код: java
1.
2.
3.
Shape shape = shapeFactory.getShape("CIRCLE"); 

((Circle)shape).getRadius();
...
Рейтинг: 0 / 0
Friday pattern
    #38529558
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

Идея в том что вы не создаете - новые объекты где попало и как попало -а берете из из одного места !

К примеру в определенном месте кода Вам надо добавить цвет к фигуре (закрасить ее).
И передать дальше

по вашей логики в этом методе Вам нужно будет создавать каждый раз новый экземпляр - выставлять ему цвет и отдавать дальше , вопрос как отдавать ?

в такой схеме - Proxy метод будет таким :

Код: java
1.
2.
3.
4.
5.
Shape getColorShape(String type , String color){ 
Shape shape = shapeFactory.getShape(type); 
shape.setColor(color);
return color; 
}



может кто то придумает более корректную задачу !
...
Рейтинг: 0 / 0
Friday pattern
    #38529606
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просьба!

Если пишите про антипаттеры, то пишите почему так делать не надо! Иначе это выглядит совершенно безапелляционно!

В часности, публикация this в конструкторе плоха тем, что если после публикации возникнет исключение, то обьект не будет удален сборщиком мусора, но по факту обьект будет неполностью сконструированым.

Кроме того, при публикации this в другой поток, этот другой поток может вызывать методы в то время как в данном потоке еще не завершился конструктор.

И возможно еще что-нибудь.
...
Рейтинг: 0 / 0
Friday pattern
    #38529617
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokВ часности, публикация this в конструкторе плоха тем, что если после публикации возникнет исключение, то обьект не будет удален сборщиком мусора...
Не понял.
...
Рейтинг: 0 / 0
Friday pattern
    #38529633
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczchabapokВ часности, публикация this в конструкторе плоха тем, что если после публикации возникнет исключение, то обьект не будет удален сборщиком мусора...
Не понял.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
public class Prob1 {
    public static void main(String[] args){        
        try{
            Prob2 p2 = new Prob2(5);
            //по задумке такой обьект не должен покинуть эту область видимости.
        }catch(Throwable th){}


//....где-то дальше в коде
//тут prob2 - неполностью сконструированный объект, но даже проверку на null проходит
        if(prob2!=null)
             prob2.traceState();  //i=0, т.е.  он недоконструировался.

    }
    static Prob2 prob2;
    
    static void register(Prob2 p) { prob2 =p; }
    
}

class Prob2{
    int i;
    Prob2(int z){
        Prob1.register(this); //отдали ссылку на this в конструкторе. Так делать ненадо.
        if (z==5) throw new RuntimeException("Вот блин! Внезапное непредвиденное исключение!");
        i=10;
    }
    void traceState() { System.out.println("i="+i); }
}
...
Рейтинг: 0 / 0
Friday pattern
    #38529644
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

Я так и не понял профита от паттернов проектирования, если честно. Те примеры, в т.ч. в википедии, хорошо смотрятся на идеальных задачах, а если попробовать сделать программу не ради самих паттернов, а для какой-то цели, то все-равно в итоге получится каша. У вас даже для того, чтобы получить цвет фигуры необходимо написать 5 строчек кода. Дак где профит от их использования?
...
Рейтинг: 0 / 0
Friday pattern
    #38529650
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892 Я так и не понял профита от паттернов проектирования, если честно. Те примеры, в т.ч. в википедии, хорошо смотрятся на идеальных задачах, а если попробовать сделать программу не ради самих паттернов, а для какой-то цели, то все-равно в итоге получится каша. У вас даже для того, чтобы получить цвет фигуры необходимо написать 5 строчек кода. Дак где профит от их использования?
Паттерны проектирования, на самом деле это не столько руководство к действию, сколько справочник именования типовых подходов. Отсюда и подобное недопонимание.
...
Рейтинг: 0 / 0
Friday pattern
    #38529675
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892,

Это нормально. Профит бывает не всегда и не везде, а только там где паттерн реально к месту.

Некоторые задачи без паттернов получаются короче (иногда - значительно короче), но менее наглядны и менее гибки, и паттерн используют для гибкости. А инога паттерны только мешают... Для каждой конктретной ситуации надо смотреть оправданность применения паттерна.

Я вот, например, непонимаю профита от Hibernate - куча конфигов в разных местах, для моих задач быстрей написать инсерты, и кода раз в 5 меньше выходит. Просто скорей всего это значит, что он ненужен для моих задач.

ps. Профита от ShapeFactory в таком виде как приведено, тоже не вижу. Разве что эти строки "CIRCLE", "RECTANGLE" и тд приходят извне и известны только на этапе выполнения.
...
Рейтинг: 0 / 0
Friday pattern
    #38529680
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapok,
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
public class Prob1 {
    public static void main(String[] args){        
        try{
            Prob2 p2 = new Prob2(5);
            //по задумке такой обьект не должен покинуть эту область видимости.
            // да, Но дальше можно так
            anotherMethod(p2);  // а так покидает
        }catch(Throwable th){}


//....где-то дальше в коде
//тут prob2 - неполностью сконструированный объект, но даже проверку на null проходит
        if(prob2!=null)
             prob2.traceState();  //i=0, т.е.  он недоконструировался.

    }
    static Prob2 prob2;
    
    static void register(Prob2 p) { prob2 =p; }
    
}

class Prob2{
    int i;
    Prob2(int z){
        Prob1.register(this); //отдали ссылку на this в конструкторе. Так делать ненадо.
        if (z==5) throw new RuntimeException("Вот блин! Внезапное непредвиденное исключение!");
        i=10;
    }
    void traceState() { System.out.println("i="+i); }
    // а чем лучше такой метод?
   void prob2Method(int z){
        Prob1.register(this); //отдали ссылку на this в конструкторе. Так делать ненадо.
        if (z==5) throw new RuntimeException("Вот блин! Внезапное непредвиденное исключение!");
        i=10;
    }
}



Но вопрос был про сборщик мусора. В С++, например, в таких случая(исключение в конструкторе) не бывает утечки.
...
Рейтинг: 0 / 0
Friday pattern
    #38529714
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо! корректное замечание!
chabapokПросьба!
Кроме того, при публикации this в другой поток, этот другой поток может вызывать методы в то время как в данном потоке еще не завершился конструктор.

И возможно еще что-нибудь.

Думаю это самое главное - в многопоточном программирование использование антипаттерна опасно.
...
Рейтинг: 0 / 0
Friday pattern
    #38529729
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использование патерна хорошо видно на таком примере :
(тут нужно знать Модель памяти Java. )

До завершения конструктора объект может быть не целостным (не все поля
инициализированы, не все инварианты состояния выполняются)

Источник неприятностей :
ссылка на объект доступна другому потоку до создания объекта и нет
никаких специальных синхронизаций .


Пример небезопасной инициализации

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public Holder holder; 
 public void initialize() { 
    holder = new Holder(42); 
  } 
... 
  public class Holder { 
            private int n; 
 
     public Holder(int n) { 
        this.n = n; 
      } 

    public void assertSanity() { 
           if (n != n) 
            throw new AssertionError("This statement is false."); 
      } 
} 



Код: java
1.
2.
3.
4.
5.
6.
7.
//Thread1 
initialize(); 
 
//Thread2 
if (holder != null){ 
 holder.assertSanity(); 
}
...
Рейтинг: 0 / 0
Friday pattern
    #38529753
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Начну Сам :

Антипаттерн – публикация this в конструкторе
[src java]
public class ThisEscape {
...
public ThisEscape(EventSource source) {
source.registerListener(new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
});
...
}
}




Антипаттерн вроде как предполагает, что "так делать плохо".

Ну и чем же плохо так делать, объясни ...
...
Рейтинг: 0 / 0
Friday pattern
    #38529765
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivАнтипаттерн вроде как предполагает, что "так делать плохо".

Ну и чем же плохо так делать, объясни ...

Вроде как уже привели пример и рассказали!?

Давайте так Вы сами - приведете пример! :) так будет лучше - для Вас .
...
Рейтинг: 0 / 0
Friday pattern
    #38529770
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1решение - использовать фабричный метод :

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class SafeListener { 
     private final EventListener listener; 
     private SafeListener() { 
         listener = new EventListener() { 
                 public void onEvent(Event e) { 
                doSomething(e); 
          } 
         }; 
  } 

 public static SafeListener newInstance(EventSource source) { 
   SafeListener safe = new SafeListener(); 
   source.registerListener(safe.listener); 
 return safe; 
 } 
} 




Самый большой антипаттерн Java-программистов -- это повальный идиотизм.
Ну вот нахрена писать в SafeListener вложенный нестатический класс, если можно сам SafeListener уже унаследовать от EventListener и реализовать там этот void onEvent(Event e) ?
...
Рейтинг: 0 / 0
Friday pattern
    #38529777
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Наследлование - антипаттерн.
...
Рейтинг: 0 / 0
Friday pattern
    #38529778
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1MasterZivАнтипаттерн вроде как предполагает, что "так делать плохо".

Ну и чем же плохо так делать, объясни ...

Вроде как уже привели пример и рассказали!?

Давайте так Вы сами - приведете пример! :) так будет лучше - для Вас .

По мне, пример показывает что не надо(нельзя) чтобы конструктор генерировал исключение, или создавай метод и вызывай после создания.
...
Рейтинг: 0 / 0
Friday pattern
    #38529779
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Atum1,

Я так и не понял профита от паттернов проектирования, если честно. .... Дак где профит от их использования?

Паттерны проектирования -- это стандартный способ решить стандартные задачи.
Всё, не больше, и не меньше.
Если твоя задача совпадает со стандартной, ты можешь её решить этим стандартным образом, уже кем-то придуманным и поделёным с тобой (собственно, поделиться опытом -- и была задача ТОЙ книги). Или ты можешь порвать на груди тельняшку и придумать свой, другой способ. И потом им поделиться с миром.
Ну и профит в том, что если тельняшку рвать не охота, можешь сделать, как уже придумали другие.

Вот собственно и всё.
...
Рейтинг: 0 / 0
Friday pattern
    #38529784
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1MasterZivАнтипаттерн вроде как предполагает, что "так делать плохо".

Ну и чем же плохо так делать, объясни ...

Вроде как уже привели пример и рассказали!?

Давайте так Вы сами - приведете пример! :) так будет лучше - для Вас .

Я сверху вниз иду и пишу.. потом дальше читаю, потом дальше пишу.
...
Рейтинг: 0 / 0
Friday pattern
    #38529785
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛагманMasterZiv,

Наследлование - антипаттерн.


Ну, если не умеешь им пользоваться -- то да...
...
Рейтинг: 0 / 0
Friday pattern
    #38529786
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у java-девелопера почти всё - "паттерн". Даже цикл и операция логического ветвления.
...
Рейтинг: 0 / 0
Friday pattern
    #38529836
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FDНо вопрос был про сборщик мусора. В С++, например, в таких случая(исключение в конструкторе) не бывает утечки.
фраза "Не понял" не является вопросом про сборку мусора.

Тот код что я привел - не утечка памяти. Ведь обьект доступен, и пользоваться им можно, другое дело что он недоконструирован что не есть хорошо.

А то что вы добавили - не приводит проблемам недоконсруированных обьектов.

Сборка мусора не при чем, хотя и добавляет очевидну фичу - раз ссылка на обьект есть, он собран не будет.

В с++ точно так же можно опубликовать ссылку на себя в конструкторе и поиметь sigseg когда-нибудь потом.

кто-тоНу вот нахрена писать в SafeListener вложенный нестатический класс, если можно сам SafeListener уже унаследовать от EventListener
SafeListener может уже наследовать что-то полезное...
...
Рейтинг: 0 / 0
Friday pattern
    #38529845
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokСборка мусора не при чем, хотя и добавляет очевидну фичу - раз ссылка на обьект есть, он собран не будет.

Кто-то путается в показаниях. То безопасная публикация влияет на сборку мусора, а теперь она не при чем.
...
Рейтинг: 0 / 0
Friday pattern
    #38529872
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто-то придирается к словам. Вы определенно хотите об этом поговорить.

У нас есть ссылка на обьект. Значит он не будет собран. Что именно вам тут неясно?

Теперь усложняем:
Мы из конструктора опубликовали ссылку на обьект за пределы блока try. Но потом было исключение. Будет ли такой обьект собран? Мы вроде вышли из блока try{}, значит вроде все ок? Но нет. У нас есть опубликованная ссылка на обьект, а значит он не будет собран, значит мы к нему можем обратиться, но он недоконструирован.

Что именно вам тут неясно? Что вам не нравится? Если такая формулировка вам не нравится - почему вы не сформулируйте это как считаете нужным? Я знаю - вы можете это сделать.
...
Рейтинг: 0 / 0
Friday pattern
    #38529883
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokУ нас есть ссылка на обьект. Значит он не будет собран. Что именно вам тут неясно?


Я кстати тоже не понял. Потом подумал, и понял.
...
Рейтинг: 0 / 0
Friday pattern
    #38529897
0FD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapok0FDНо вопрос был про сборщик мусора. В С++, например, в таких случая(исключение в конструкторе) не бывает утечки.
фраза "Не понял" не является вопросом про сборку мусора.

Тот код что я привел - не утечка памяти. Ведь обьект доступен, и пользоваться им можно, другое дело что он недоконструирован что не есть хорошо.

А то что вы добавили - не приводит проблемам недоконсруированных обьектов.

Сборка мусора не при чем, хотя и добавляет очевидну фичу - раз ссылка на обьект есть, он собран не будет.

В с++ точно так же можно опубликовать ссылку на себя в конструкторе и поиметь sigseg когда-нибудь потом.

Понял буквально, но все равно обьект будет под управлением сборщика и может быть удален сборщиком.
То что я привел показывает, что даже если перенести из конструктора(тот же самый метод без void) в отдельный метод не решает проблемы, либо более реальные примеры приводите.
...
Рейтинг: 0 / 0
Friday pattern
    #38529909
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokКто-то придирается к словам. Вы определенно хотите об этом поговорить.
Пятница жа.

chabapokУ нас есть ссылка на обьект. Значит он не будет собран. Что именно вам тут неясно?

Точность формулировки смущает. Потому что если эту трактовку убрать из конктекста, то она тоже будет неверной.

chabapokМы из конструктора опубликовали ссылку на обьект за пределы блока try. Но потом было исключение. Будет ли такой обьект собран? Мы вроде вышли из блока try{}, значит вроде все ок? Но нет. У нас есть опубликованная ссылка на обьект, а значит он не будет собран, значит мы к нему можем обратиться, но он недоконструирован.

Вооот. Это оно.

chabapokЧто именно вам тут неясно? Что вам не нравится? Если такая формулировка вам не нравится - почему вы не сформулируйте это как считаете нужным? Я знаю - вы можете это сделать.

Мне не ясно зачем писать такие громкие заявления
chabapokВ часности, публикация this в конструкторе плоха тем, что если после публикации возникнет исключение, то обьект не будет удален сборщиком мусора
Без конкретных уточнений.
...
Рейтинг: 0 / 0
Friday pattern
    #38530023
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНу вот нахрена писать в SafeListener вложенный нестатический класс, если можно сам SafeListener уже унаследовать от EventListener и реализовать там этот void onEvent(Event e) ?

Я думаю , мы дойдем и до Вашего вопроса, кстати ответ есть в книге - в Виде Паттерна .

Просто Есть много похожих Паттернов - и надо их увидеть , различать и понимать ... для этого тема и была создана
...
Рейтинг: 0 / 0
Friday pattern
    #38530035
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0FD Понял буквально, но все равно обьект будет под управлением сборщика и может быть удален сборщиком.
Ясное дело.


0FDТо что я привел показывает, что даже если перенести из конструктора(тот же самый метод без void) в отдельный метод не решает проблемы

Как же ж не решает? Не решает для тех, кто рассматривает конструктор как метод. Но конструктор, по задумке - не метод, а конструктор! Есть отличия. Изза сегодняшней придирчивости Blazkowicz я побоюсь в них сильно углубляться.
Ненормально использовать методы неполностью сконструированного обьекта. Это опасно тем, что может приводить к трудноуловимым ошибкам, а если такой обьект юзать из другого потока, то это может приводить к ошибкам "состояние гонки".
Причем, это касается не только java.

0FDболее реальные примеры приводите.
Я не могу вот так сходу придумать более реальный однопоточный пример. Поэтому, более реальные примеры пускай приводит топикстартер, я лишь уточинил его недосказанность.

Навскидку чуть более реальный пример, это когда у вас поле не int i, а final OtherObject obj. В конструкторе final-поле, как известно, должно инициализироваться, но из за исключения оно не успевает проинициализироваться. А программист надеется что финал-поле будет именно таким как он указал в конструкторе.

Насчет более реального многопоточного примера. Привожу пример: пускай исключений нет, но конструктор публикует this в другой поток. Чем это грозит? Другой поток может вызвать методы обьекта еще до завершения конструктора в текущем потоке. В этом случае непредсказуемо какое значение полей увидит другой поток - уже проинициализированное в конструкторе либо еще нет.

надеюсь, понятно описал.
...
Рейтинг: 0 / 0
Friday pattern
    #38530040
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Factory Pattern

как его увидеть в коде или когда его можно применить ?!

Для себя (как памятка) вывел такое привило (самый простой вариант ) - это

Если в голове или коде - встречается что то из списка :

cо словом static в сигнатуре или в названии:

valueOf , EnumSet , getInstance , getType , newInstance

перед нами - Factory Pattern .

так же На ряду с конструктором класса для получения экземпляра - так же можно добавить фабричный метод получения экземпляров данного класса ( Если они требуются )

(Это как определить toString() , equals () , hashСode() - > valueOf() джентльменский набор )

Пример :

Код: java
1.
2.
3.
public static Boolean valueOf(boolean b) {
  return b ? Boolean.TRUE : Boolean.FALSE;
}
...
Рейтинг: 0 / 0
Friday pattern
    #38530113
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

Examples of GoF Design Patterns

P.S.
КПД этого мегапоста просто зашкаливает!
...
Рейтинг: 0 / 0
Friday pattern
    #38530131
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman,

Я эту ссылку видел раз 100 - как она Вам помогла?
...
Рейтинг: 0 / 0
Friday pattern
    #38530145
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Usman,

Я эту ссылку видел раз 100 - как она Вам помогла?Видел уже в 10 раз больше Вас, и до сих пор продолжает помогать...
Действительно очень хороший пост.
имхо - ЛикБез по паттернам
...
Рейтинг: 0 / 0
Friday pattern
    #38537805
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Abstract Factory Pattern

порождающий шаблон проектирования, позволяющий изменять поведение системы, варьируя создаваемыми объектами, при этом сохраняя интерфейсы. Он позволяет создавать целые группы взаимосвязанных объектов, которые, будучи созданными одной фабрикой, реализуют общее поведение. Шаблон реализуется созданием абстрактного класса Factory, который представляет собой интерфейс для создания компонентов системы (например, для оконного интерфейса он может создавать окна и кнопки). Затем пишутся классы, реализующие этот интерфейс.

Код: java
1.
2.
3.
4.
//Shape.java 
public interface Shape { 
 void draw(); 
} 



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
//Rectangle.java 
public class Rectangle implements Shape { 
 
 @Override 
 public void draw() { 
 System.out.println("Inside Rectangle::draw() method."); 
 } 
} 


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
 
//Square.java 
public class Square implements Shape { 
 
 @Override 
 public void draw() { 
 System.out.println("Inside Square::draw() method."); 
 } 
} 



//Color.java
Код: java
1.
2.
3.
public interface Color { 
 void fill(); 
} 



Red.java
Код: java
1.
2.
3.
4.
5.
6.
7.
public class Red implements Color { 
 
 @Override 
 public void fill() { 
 System.out.println("Inside Red::fill() method."); 
 } 
}



Green.java
Код: java
1.
2.
3.
4.
5.
6.
7.
public class Green implements Color { 
 
 @Override 
 public void fill() { 
 System.out.println("Inside Green::fill() method."); 
 } 
}



AbstractFactory.java
Код: java
1.
2.
3.
4.
public abstract class AbstractFactory { 
 abstract Color getColor(String color); 
 abstract Shape getShape(String shape) ; 
} 



ShapeFactory.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class ShapeFactory extends AbstractFactory { 
 
 @Override 
 public Shape getShape(String shapeType){ 
 if(shapeType == null){ 
 return null; 
 } 
 if(shapeType.equalsIgnoreCase("CIRCLE")){ 
 return new Circle(); 
 } else if(shapeType.equalsIgnoreCase("RECTANGLE")){ 
 return new Rectangle(); 
 } else if(shapeType.equalsIgnoreCase("SQUARE")){ 
 return new Square(); 
 } 
 return null; 
 } 
 
 @Override 
 Color getColor(String color) { 
 return null; 
 } 
} 



ColorFactory.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class ColorFactory extends AbstractFactory { 
 
 @Override 
 public Shape getShape(String shapeType){ 
 return null; 
 } 
 
 @Override 
 Color getColor(String color) { 
 if(color == null){ 
 return null; 
 } 
 if(color.equalsIgnoreCase("RED")){ 
 return new Red(); 
 } else if(color.equalsIgnoreCase("GREEN")){ 
 return new Green(); 
 } else if(color.equalsIgnoreCase("BLUE")){ 
 return new Blue(); 
 } 
 return null; 
 } 
} 



FactoryProducer.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class FactoryProducer { 
 public static AbstractFactory getFactory(String choice){ 
 if(choice.equalsIgnoreCase("SHAPE")){ 
 return new ShapeFactory(); 
 } else if(choice.equalsIgnoreCase("COLOR")){ 
 return new ColorFactory(); 
 } 
 return null; 
 } 
} 




AbstractFactoryPatternDemo.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
public class AbstractFactoryPatternDemo { 
 public static void main(String[] args) { 
 
 //get shape factory 
 AbstractFactory shapeFactory = 
FactoryProducer.getFactory("SHAPE"); 
 
 //get an object of Shape Circle 
 Shape shape1 = shapeFactory.getShape("CIRCLE"); 
 
 //call draw method of Shape Circle 
 shape1.draw(); 
 
 //get an object of Shape Rectangle 
 Shape shape2 = shapeFactory.getShape("RECTANGLE"); 
 
 //call draw method of Shape Rectangle 
 shape2.draw(); 
 
 //get an object of Shape Square 
 Shape shape3 = shapeFactory.getShape("SQUARE"); 
 
 //call draw method of Shape Square 
 shape3.draw(); 
 
 //get color factory 
 AbstractFactory colorFactory = 
FactoryProducer.getFactory("COLOR"); 
  
 //get an object of Color Red 
 Color color1 = colorFactory.getColor("RED"); 
 
 //call fill method of Red 
 color1.fill(); 
 
 //get an object of Color Green 
 Color color2 = colorFactory.getColor("Green"); 
 
 //call fill method of Green 
 color2.fill();  
 //get an object of Color Blue 
 Color color3 = colorFactory.getColor("BLUE"); 
 
 //call fill method of Color Blue 
 color3.fill(); 
 } 
}




Код: java
1.
2.
3.
4.
5.
6.
Inside Circle::draw() method. 
Inside Rectangle::draw() method. 
Inside Square::draw() method. 
Inside Red::fill() method. 
Inside Green::fill() method. 
Inside Blue::fill() method. 



Фактически мы объединили несколько фабрик в одну для производства экземпляров на все случаи жизни ....

в каких местах кода это может быть удобно ?

Фибрика фабрик , для каких целей и как ее можно увидеть , понять что она нужна ?


вообще такой подход когда у нас в интерфейсе (абстрактном классе ) указаны другие интерфейсы используется повсеместно ...и довольно часто , в огромном количестве решений и паттернов.

отсюда вытекает вопрос - нет ли описания, формулы которая пояснит это поведение, кто придумал такой трюк ? итд...
...
Рейтинг: 0 / 0
Friday pattern
    #38537809
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Abstract Factory предоставляет интерфейс для создания семейств связанных или зависимых объектов ,позволяя не указывать их конкретные классы. При таком подходе основная проблема - видна сразу - трудоемкость добавления новых объектов .

так же и при удалении ... а вот какие плюсы?
...
Рейтинг: 0 / 0
Friday pattern
    #38537813
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может кто нибудь привести такой же простой пример этого паттерна но используя Reflection ?
...
Рейтинг: 0 / 0
Friday pattern
    #38537815
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нашел более интересный пример использования тут

http://www.javenue.info/post/27

Код: java
1.
2.
3.
4.
5.
6.
public void createSquadron (SquadronFactory factory) {
  Mage mage = factory.createMage();
  Archer archer = factory.createArcher();
  Warrior warrior = factory.createWarrior();
  ...
}



когда из абстрактной фабрики создаем абстрактных персонажей ... т.е. посылая в этот метод нужную нам фабрику мы можем получать нужный нам отряд ... и выполнять над ним общие действия. так?
...
Рейтинг: 0 / 0
Friday pattern
    #38537859
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Фибрика фабрик , для каких целей и как ее можно увидеть , понять что она нужна ? http://ru.wikipedia.org/wiki/Инверсия_управления Формулировка:
Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракции.

Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.
...
Рейтинг: 0 / 0
Friday pattern
    #38537904
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman,

О! Спасибо! как то не думал, что тут явно присутствует этот паттерн.
...
Рейтинг: 0 / 0
Friday pattern
    #38544519
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Singleton Design Pattern

порождающий шаблон проектирования, гарантирующий что в однопоточном приложении будет единственный экземпляр класса с глобальной точкой доступа.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
//SingleObject.java 
public class SingleObject { 
 
 //create an object of SingleObject 
 private static SingleObject instance = new SingleObject(); 
 
 //make the constructor private so that this class cannot be 
 //instantiated 
 private SingleObject(){} 
 
 //Get the only object available 
 public static SingleObject getInstance(){ 
 return instance; 
 } 
 
 public void showMessage(){ 
 System.out.println("Hello World!"); 
 } 
} 



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
//SingletonPatternDemo.java 
public class SingletonPatternDemo { 
 public static void main(String[] args) { 
 
 //illegal construct 
 //Compile Time Error: The constructor SingleObject() is not visible 
 //SingleObject object = new SingleObject(); 
 
 //Get the only object available 
 SingleObject object = SingleObject.getInstance(); 
 
 //show the message 
 object.showMessage(); 
 } 
} 



Код: java
1.
Hello World! 
...
Рейтинг: 0 / 0
Friday pattern
    #38544523
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы не забыть , более корректно через Demand Holder
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class Singleton {  
   private Singleton() {}
 
   private static class SingletonHolder {  
      public static final Singleton instance = new Singleton();  
   }  
 
   public static Singleton getInstance()  {  
      return SingletonHolder.instance;  
   }  
}



Основной вопрос по этому паттерну - наверное это его поведение в многопоточной среде .
Как, почему,зачем и где его можно встретить?
...
Рейтинг: 0 / 0
Friday pattern
    #38544758
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1может кто нибудь привести такой же простой пример этого паттерна но используя Reflection ?
MVC, а именно М - модели.
Была у меня такая задача, реализация MVC паттерна.
В рамках этой задачи была создана фабрика моделей, которая создавала конкретные модели используя Reflection по полному имени класса.
Очень упрощённо
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
public class ModelFactory{

  private static ModelFactory singleton = null;

  private ModelFactory(){
     ...
       //здесь инициализация фабрики
     ...
  }

  private ModelFactory getSelf(){
     if(singleton==null){
         singleton = new ModelFactory();
     }
     return singleton;
  }

  public static AbstractModel getModel(String modelClassName) throws ...{
    return getSelf().internalGetModel(modelClassName);
  }

  protected AbstractModel internalGetModel(String modelClassName) throws ...{
    if(...){
     // различные проверки
    }
    Class mdlClass = Class.forName(modelClassName);

    AbstractModel model = (AbstractModel)mdlClass.getInstance();
  
    // Предварительная настройка модели
    ...

    return model;
  }
}



Вместе с тем у такого шаблона есть недостаток - он слабо применим в WEB приложениях, т.к. синглтоны могут дать утечку памяти при UNDEPLOY приложения... А вот в GUI приложении очень даже неплохо себя показывает. IMHO, вместе с тем этот шаблон применим когда у Вас моделей более 20, а до этого числа можно и не использовать фабрику моделей, а создавать их самостоятельно по мере надобности.

Кстати, JDBC драйвера загружаются по этому-же принципу...
...
Рейтинг: 0 / 0
Friday pattern
    #38544823
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Чтобы не забыть , более корректно через Demand Holder Корректных имплементаций синглтона много. Это и холдер, и final, и DCL, и т.д..

Atum1Основной вопрос по этому паттерну - наверное это его поведение в многопоточной среде.Ответ таков:
1) Его надо корректно опубликовать.
2) Его методы должны быть thread-safe.

Atum1Как, почему,зачем и где его можно встретить?Причин на его использование тысяча и одна. Например, классическое enterprise-приложение с anemic моделью, очень часто целиком и полностью состоит из синглтонов (напр., созданных через Spring).
...
Рейтинг: 0 / 0
Friday pattern
    #38553494
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Builder Design Pattern

порождающий шаблон проектирования.

Отделяет конструирование сложного объекта от его представления, так что в результате одного и того же процесса конструирования могут получаться разные представления.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
//Item.java 
public interface Item { 
 public String name(); 
 public Packing packing(); 
 public float price(); 
} 
 
//Packing.java 
public interface Packing { 
 public String pack(); 
}


//Wrapper.java 
public class Wrapper implements Packing { 
 
 @Override 
 public String pack() { 
 return "Wrapper"; 
 } 
} 
 
//Bottle.java 
public class Bottle implements Packing { 
 
 @Override 
 public String pack() { 
 return "Bottle"; 
 } 
}


//Burger.java 
public abstract class Burger implements Item { 
 
 @Override 
 public Packing packing() { 
 return new Wrapper(); 
 } 
 
 @Override 
 public abstract float price(); 
} 
 
//ColdDrink.java 
public abstract class ColdDrink implements Item { 
 
 @Override 
 public Packing packing() { 
 return new Bottle(); 
 } 
 
 @Override 
 public abstract float price(); 
}


//VegBurger.java 
public class VegBurger extends Burger { 
 
 @Override 
 public float price() { 
 return 25.0f; 
 } 
 
 @Override 
 public String name() { 
 return "Veg Burger"; 
 } 
} 
 
//ChickenBurger.java 
public class ChickenBurger extends Burger { 
 
 @Override 
 public float price() { 
 return 50.5f; 
 } 
 
 @Override 
 public String name() { 
 return "Chicken Burger"; 
 } 
} 
 
//Coke.java 
public class Coke extends ColdDrink { 
 
 @Override 
 public float price() { 
 return 30.0f; 
 } 
 
 @Override 
 public String name() { 
 return "Coke"; 
 } 
} 
 
//Pepsi.java 
public class Pepsi extends ColdDrink { 
 
 @Override 
 public float price() { 
 return 35.0f; 
 } 
  
 @Override 
 public String name() { 
 return "Pepsi"; 
 } 
} 

//Meal.java 
import java.util.ArrayList; 
import java.util.List; 
 
public class Meal { 
 private List<Item> items = new ArrayList<Item>(); 
 
 public void addItem(Item item){ 
 items.add(item); 
 } 
 
 public float getCost(){ 
 float cost = 0.0f; 
 for (Item item : items) { 
 cost += item.price(); 
 } 
 return cost; 
 } 
 
 public void showItems(){ 
 for (Item item : items) { 
 System.out.print("Item : "+item.name()); 
 System.out.print(", Packing : "+item.packing().pack()); 
 System.out.println(", Price : "+item.price()); 
 } 
 } 
}

//MealBuilder.java 
public class MealBuilder { 
 
 public Meal prepareVegMeal (){ 
 Meal meal = new Meal(); 
 meal.addItem(new VegBurger()); 
 meal.addItem(new Coke()); 
 return meal; 
 } 
 
 public Meal prepareNonVegMeal (){ 
 Meal meal = new Meal();  
TUTORIALS POINT 
Simply Easy Learning Page 23 
 meal.addItem(new ChickenBurger()); 
 meal.addItem(new Pepsi()); 
 return meal; 
 } 
} 




Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
public class BuilderPatternDemo { 
 public static void main(String[] args) { 
 MealBuilder mealBuilder = new MealBuilder(); 
 
 Meal vegMeal = mealBuilder.prepareVegMeal(); 
 System.out.println("Veg Meal"); 
 vegMeal.showItems(); 
 System.out.println("Total Cost: " +vegMeal.getCost()); 
 
 Meal nonVegMeal = mealBuilder.prepareNonVegMeal(); 
 System.out.println("\n\nNon-Veg Meal"); 
 nonVegMeal.showItems(); 
 System.out.println("Total Cost: " +nonVegMeal.getCost()); 
 } 
} 
...
Рейтинг: 0 / 0
Friday pattern
    #38568714
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prototype Design Pattern
порождающий шаблон проектирования, его осбенность в том, что это паттерн создания объекта через клонирование другого объекта вместо создания через конструктор.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
//Shape.java 
public abstract class Shape implements Cloneable { 
 
 private String id; 
 protected String type; 
 
 abstract void draw(); 
 
 public String getType(){ 
 return type; 
 } 
 
 public String getId() { 
 return id; 
 } 
 
 public void setId(String id) { 
 this.id = id; 
 } 
 
 public Object clone() { 
 Object clone = null; 
 try { 
 clone = super.clone(); 
 } catch (CloneNotSupportedException e) { 
 e.printStackTrace(); 
 } 
 return clone; 
 } 
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//Rectangle.java 
public class Rectangle extends Shape { 
 
 public Rectangle(){ 
 type = "Rectangle"; 
 } 
 
 @Override 
 public void draw() { 
 System.out.println("Inside Rectangle::draw() method.");  
 } 
} 



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//Square.java 
public class Square extends Shape { 
 
 public Square(){ 
 type = "Square"; 
 } 
 
 @Override 
 public void draw() { 
 System.out.println("Inside Square::draw() method."); 
 } 
} 




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
//ShapeCache.java
import java.util.Hashtable; 
 
public class ShapeCache { 
 
 private static Hashtable<String, Shape> shapeMap 
 = new Hashtable<String, Shape>(); 
 
 public static Shape getShape(String shapeId) { 
 Shape cachedShape = shapeMap.get(shapeId); 
 return (Shape) cachedShape.clone(); 
 } 
 
 // for each shape run database query and create shape 
 // shapeMap.put(shapeKey, shape); 
 // for example, we are adding three shapes 
 public static void loadCache() { 
 Circle circle = new Circle(); 
 circle.setId("1"); 
 shapeMap.put(circle.getId(),circle); 
 
 Square square = new Square();  

 square.setId("2"); 
 shapeMap.put(square.getId(),square); 
 
 Rectangle rectangle = new Rectangle(); 
 rectangle.setId("3"); 
 shapeMap.put(rectangle.getId(),rectangle); 
 } 
} 








Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
//PrototypePatternDemo.java 
public class PrototypePatternDemo { 
 public static void main(String[] args) { 
 ShapeCache.loadCache(); 
 
 Shape clonedShape = (Shape) ShapeCache.getShape("1"); 
 System.out.println("Shape : " + clonedShape.getType()); 
 
 Shape clonedShape2 = (Shape) ShapeCache.getShape("2"); 
 System.out.println("Shape : " + clonedShape2.getType()); 
 
 Shape clonedShape3 = (Shape) ShapeCache.getShape("3"); 
 System.out.println("Shape : " + clonedShape3.getType()); 
 } 
}


Shape : Circle
Shape : Square
Shape : Rectangle
...
Рейтинг: 0 / 0
Friday pattern
    #38568715
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
один вопрос когда и как правильно выбирать между
abstract factory и Prototype.
...
Рейтинг: 0 / 0
Friday pattern
    #38569076
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Friday pattern
    #38569163
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman, хочется видеть пример из жизни , практический и наглядный
...
Рейтинг: 0 / 0
Friday pattern
    #38569206
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1один вопрос когда и как правильно выбирать между
abstract factory и Prototype.
Чем Mock отличается от Prototype?
...
Рейтинг: 0 / 0
Friday pattern
    #38569225
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Usman, хочется видеть пример из жизни , практический и наглядный
Ну вот например:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
  ...
public class ChildRecord extends BaseRecord implements Clonable{

     protected object parentID = null;
     private object ownID = null;
     protected string description = null;

     public ChildRecord(objet parID, string aDescr){
        parentID = parID;
        ownID = getMyNewOwnId();
        description = aDescr;
     }
     
     public void setDescription(string descr){
         this.description = descr;
     }

    @Override
    public ChildRecord clone() throws CloneNotSupportedException {
        ChildRecord copy = new ChildRecord();
        copy.parentID = this.parentID;
        copy.ownID = getMyNewOwnId(); 
 
        return copy;
    }

}

   ну и где-то далее в модели
    ...
    private ChildRecord currentRecord;
    ...
    private ChildRecord createParentedRecord(){
         return currentRecord.clone();
    }

   и ещё в этой же модели...
   public ChildRecord addNewRecord(string aDescr){
       ChildRecord newRec = createParentedRecord();
       
       newRec.setDescription(aDescr);
       records.add(newRecord);
       currentRecord = newRec;
       
       return newRec;
   }

Может применяться в моделях реализующих отношение Master/Detail
...
Рейтинг: 0 / 0
Friday pattern
    #38599111
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Adapter Design Pattern

структурный шаблон проектирования, предназначенный для организации использования функций объекта, недоступного для модификации, через специально созданный интерфейс.

Система поддерживает требуемые данные и поведение, но имеет неподходящий интерфейс.

Адаптер предусматривает создание класса-оболочки с требуемым интерфейсом.


Код: java
1.
2.
3.
4.
//MediaPlayer.java 
public interface MediaPlayer { 
 public void play(String audioType, String fileName); 
} 


Код: java
1.
2.
3.
4.
5.
//AdvancedMediaPlayer.java 
public interface AdvancedMediaPlayer { 
 public void playVlc(String fileName); 
 public void playMp4(String fileName); 
} 




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
//VlcPlayer.java 
public class VlcPlayer implements AdvancedMediaPlayer{ 
 @Override 
 public void playVlc(String fileName) { 
 System.out.println("Playing vlc file. Name: "+ fileName); 
 } 
 
 @Override 
 public void playMp4(String fileName) { 
 //do nothing 
 } 
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
//Mp4Player.java 
public class Mp4Player implements AdvancedMediaPlayer{ 
 
 @Override 
 public void playVlc(String fileName) { 
 //do nothing 
 } 
 
 @Override 
 public void playMp4(String fileName) { 
 System.out.println("Playing mp4 file. Name: "+ fileName); 
 } 
} 



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
//MediaAdapter.java 
public class MediaAdapter implements MediaPlayer { 
 
 AdvancedMediaPlayer advancedMusicPlayer; 
 
 public MediaAdapter(String audioType){ 
 if(audioType.equalsIgnoreCase("vlc") ){ 
 advancedMusicPlayer = new VlcPlayer(); 
 } else if (audioType.equalsIgnoreCase("mp4")){ 
 advancedMusicPlayer = new Mp4Player(); 
 } 
 } 
 
 @Override 
 public void play(String audioType, String fileName) { 
 if(audioType.equalsIgnoreCase("vlc")){ 
 advancedMusicPlayer.playVlc(fileName); 
 }else if(audioType.equalsIgnoreCase("mp4")){ 
 advancedMusicPlayer.playMp4(fileName); 
 } 
 } 
} 



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
//AudioPlayer.java 
public class AudioPlayer implements MediaPlayer { 
 MediaAdapter mediaAdapter; 
 
 @Override 
 public void play(String audioType, String fileName) { 
 
 //inbuilt support to play mp3 music files 
 if(audioType.equalsIgnoreCase("mp3")){ 
 System.out.println("Playing mp3 file. Name: "+ fileName); 
 } 
 //mediaAdapter is providing support to play other file 
formats 
 else if(audioType.equalsIgnoreCase("vlc") 
 || audioType.equalsIgnoreCase("mp4")){ 
 mediaAdapter = new MediaAdapter(audioType); 
 mediaAdapter.play(audioType, fileName); 
 } 
 else{ 
 System.out.println("Invalid media. "+ 
 audioType + " format not supported"); 
 } 
 } 




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
//AdapterPatternDemo.java 
public class AdapterPatternDemo { 
 public static void main(String[] args) { 
 AudioPlayer audioPlayer = new AudioPlayer(); 
 
 audioPlayer.play("mp3", "beyond the horizon.mp3"); 
 audioPlayer.play("mp4", "alone.mp4"); 
 audioPlayer.play("vlc", "far far away.vlc"); 
 audioPlayer.play("avi", "mind me.avi"); 
 } 
} 




Код: java
1.
2.
3.
4.
5.
//Verify the output. 
Playing mp3 file. Name: beyond the horizon.mp3 
Playing mp4 file. Name: alone.mp4 
Playing vlc file. Name: far far away.vlc 
Invalid media. avi format not supported 


...
Рейтинг: 0 / 0
Friday pattern
    #38599117
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Идя для адаптера , в java ?!

можем ли мы считать адаптер в первом приближении Миксином(mixin) в java ? со всеми оговорками?
...
Рейтинг: 0 / 0
Friday pattern
    #38611886
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Чтобы не забыть , более корректно через Demand Holder
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class Singleton {  
   private Singleton() {}
 
   private static class SingletonHolder {  
      public static final Singleton instance = new Singleton();  
   }  
 
   public static Singleton getInstance()  {  
      return SingletonHolder.instance;  
   }  
}



Основной вопрос по этому паттерну - наверное это его поведение в многопоточной среде .
Как, почему,зачем и где его можно встретить?

возник такой вот вопрос :
а почему бы не делать

такую инициализацию и будет ли она потокобезопасной?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class Singleton {
    private static final Singleton instance ;

    private Singleton() {}


    static {
        instance = new Singleton();  
    }
 
  public static Singleton getInstance()  {  
      return instance;  
   } 
}



блок static и инициализация в нем instance - дает нам профит?!
Код: java
1.
2.
3.
 static {
        instance = new Singleton();  
    }
...
Рейтинг: 0 / 0
Friday pattern
    #38611908
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Atum1 ,
Оба варианта безопасны. Но:
1) В случае Холдера, синглтон будет создан только тогда, когда вы реально к нему обратитесь, так как класс SingletonHolder будет загружен только по факту вызова getInstance().
2) А во втором случае синглтон будет создан раньше, при загрузке класса Singleton, то есть когда он, возможно, еще не нужен.
...
Рейтинг: 0 / 0
Friday pattern
    #38612061
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach Atum1 ,
Оба варианта безопасны. Но:
1) В случае Холдера, синглтон будет создан только тогда, когда вы реально к нему обратитесь, так как класс SingletonHolder будет загружен только по факту вызова getInstance().
2) А во втором случае синглтон будет создан раньше, при загрузке класса Singleton, то есть когда он, возможно, еще не нужен.

а если без static

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class Singleton {
    private static final Singleton instance ;

    private Singleton() {}


   {
        instance = new Singleton();  
   }
 
  public static Singleton getInstance()  {  
      return instance;  
   } 
}
...
Рейтинг: 0 / 0
Friday pattern
    #38612066
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
  private static Singleton instance ;
...
Рейтинг: 0 / 0
Friday pattern
    #38612094
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Atum1 ,
Ну а что означают фигурные скобки в теле класса? :)
...
Рейтинг: 0 / 0
Friday pattern
    #38612534
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEVcoach,

ерунда получилась :)
...
Рейтинг: 0 / 0
Friday pattern
    #38619047
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bridge Design Pattern

Шаблон мост — структурный шаблон проектирования, используемый в проектировании программного обеспечения чтобы «разделять абстракцию и реализацию так, чтобы они могли изменяться независимо».

Шаблон bridge использует инкапсуляцию, агрегирование и может использовать наследование для того, чтобы разделить ответственность между классами.


Когда абстракция и реализация разделены, они могут изменяться независимо. Другими словами, при реализации через паттерн мост, изменение структуры интерфейса не мешает изменению структуры реализации.




//Create bridge implementer interface.
//DrawAPI.java
Код: java
1.
2.
3.
public interface DrawAPI { 
 public void drawCircle(int radius, int x, int y); 
} 




//Create concrete bridge implementer classes implementing the DrawAPI interface.
//RedCircle.java
Код: java
1.
2.
3.
4.
5.
6.
7.
public class RedCircle implements DrawAPI { 
 @Override 
 public void drawCircle(int radius, int x, int y) { 
 System.out.println("Drawing Circle[ color: red, radius: " 
 + radius +", x: " +x+", "+ y +"]"); 
 } 
} 



//GreenCircle.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public class GreenCircle implements DrawAPI { 
 @Override 
 public void drawCircle(int radius, int x, int y) { 
 System.out.println("Drawing Circle[ color: green, radius: " 
 + radius +", x: " +x+", "+ y +"]"); 
 } 
} 
 



//Create an abstract class Shape using the DrawAPI interface.
//Shape.java
Код: java
1.
2.
3.
4.
5.
6.
7.
public abstract class Shape { 
 protected DrawAPI drawAPI; 
 protected Shape(DrawAPI drawAPI){ 
 this.drawAPI = drawAPI; 
 } 
 public abstract void draw(); 
} 


//Circle.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
public class Circle extends Shape { 
 private int x, y, radius; 
 
 public Circle(int x, int y, int radius, DrawAPI drawAPI) { 
 super(drawAPI); 
 this.x = x; 
 this.y = y; 
 this.radius = radius; 
 } 
 
 public void draw() { 
 drawAPI.drawCircle(radius,x,y); 
 } 
}



//BridgePatternDemo.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class BridgePatternDemo { 
 public static void main(String[] args) { 
 Shape redCircle = new Circle(100,100, 10, new RedCircle()); 
 Shape greenCircle = new Circle(100,100, 10, new GreenCircle()); 
 
 redCircle.draw(); 
 greenCircle.draw(); 
 } 
} 



Код: java
1.
2.
Drawing Circle[ color: red, radius: 10, x: 100, 100] 
Drawing Circle[ color: green, radius: 10, x: 100, 100]


...
Рейтинг: 0 / 0
Friday pattern
    #38626456
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Filter Design Pattern

Паттерн Фильтр - является шаблоном проектирования, что позволяет разработчикам выбирать набор объектов, используя различные критерии через логические операции.сбор нескольких критериев под одну схему.


Person.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class Person { 
 
 private String name; 
 private String gender; 
 private String maritalStatus; 
 
 public Person(String name,String gender,String maritalStatus){ 
 this.name = name; 
 this.gender = gender; 
 this.maritalStatus = maritalStatus; 
 } 
 
 public String getName() { 
 return name; 
 } 
 public String getGender() { 
 return gender; 
 } 
 public String getMaritalStatus() { 
 return maritalStatus; 
 } 
} 



Criteria.java
Код: java
1.
2.
3.
4.
5.
import java.util.List; 
 
public interface Criteria { 
 public List<Person> meetCriteria(List<Person> persons); 
} 




CriteriaMale.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
import java.util.ArrayList; 
import java.util.List; 
 
public class CriteriaMale implements Criteria { 
 
 @Override 
 public List<Person> meetCriteria(List<Person> persons) { 
 List<Person> malePersons = new ArrayList<Person>(); 
 for (Person person : persons) { 
 if(person.getGender().equalsIgnoreCase("MALE")){ 
 malePersons.add(person); 
 } 
 } 
 return malePersons; 
 } 
} 




CriteriaFemale.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
import java.util.ArrayList; 
import java.util.List; 
 
public class CriteriaFemale implements Criteria { 
 
 @Override 
 public List<Person> meetCriteria(List<Person> persons) { 
 List<Person> femalePersons = new ArrayList<Person>(); 
 for (Person person : persons) { 
 if(person.getGender().equalsIgnoreCase("FEMALE")){ 
 femalePersons.add(person); 
 } 
 } 
 return femalePersons; 
 } 
}




AndCriteria.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
import java.util.List; 
 
public class AndCriteria implements Criteria { 
 
 private Criteria criteria; 
 private Criteria otherCriteria; 
 
 public AndCriteria(Criteria criteria, Criteria otherCriteria) { 
 this.criteria = criteria; 
 this.otherCriteria = otherCriteria; 
 } 
 
 @Override 
 public List<Person> meetCriteria(List<Person> persons) { 
 List<Person> firstCriteriaPersons = 
criteria.meetCriteria(persons); 
 return otherCriteria.meetCriteria(firstCriteriaPersons); 
 } 
} 




OrCriteria.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
import java.util.List; 
 
public class AndCriteria implements Criteria { 
 
 private Criteria criteria; 
 private Criteria otherCriteria; 
 
 public AndCriteria(Criteria criteria, Criteria otherCriteria) { 
 this.criteria = criteria; 
 this.otherCriteria = otherCriteria; 
 } 
 
 @Override 
 public List<Person> meetCriteria(List<Person> persons) { 
 List<Person> firstCriteriaItems = criteria.meetCriteria(persons); 
 List<Person> otherCriteriaItems = 
otherCriteria.meetCriteria(persons); 
 
 for (Person person : otherCriteriaItems) { 
 if(!firstCriteriaItems.contains(person)){ 
 firstCriteriaItems.add(person); 
 } 
 } 
 return firstCriteriaItems; 
 } 
} 



CriteriaPatternDemo.java

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
public class CriteriaPatternDemo { 
 public static void main(String[] args) { 
 List<Person> persons = new ArrayList<Person>(); 
 
 persons.add(new Person("Robert","Male", "Single")); 
 persons.add(new Person("John","Male", "Married")); 
 persons.add(new Person("Laura","Female", "Married")); 
 persons.add(new Person("Diana","Female", "Single")); 
 persons.add(new Person("Mike","Male", "Single")); 
 persons.add(new Person("Bobby","Male", "Single")); 
 
 Criteria male = new CriteriaMale(); 
 Criteria female = new CriteriaFemale(); 
 Criteria single = new CriteriaSingle(); 
 Criteria singleMale = new AndCriteria(single, male); 
 Criteria singleOrFemale = new OrCriteria(single, female); 
 
 System.out.println("Males: "); 
 printPersons(male.meetCriteria(persons)); 
 
 System.out.println("\nFemales: "); 
 printPersons(female.meetCriteria(persons)); 
 
 System.out.println("\nSingle Males: "); 
 printPersons(singleMale.meetCriteria(persons)); 
 
 System.out.println("\nSingle Or Females: "); 
 printPersons(singleOrFemale.meetCriteria(persons)); 
 } 
 
 public static void printPersons(List<Person> persons){ 
 for (Person person : persons) { 
 System.out.println("Person : [ Name : " + person.getName() 
 +", Gender : " + person.getGender() 
 +", Marital Status : " + person.getMaritalStatus() 
 +" ]"); 
 } 
 } 
}





Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Males: 
Person : [ Name : Robert, Gender : Male, Marital Status : Single ] 
Person : [ Name : John, Gender : Male, Marital Status : Married ]  

Person : [ Name : Mike, Gender : Male, Marital Status : Single ] 
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ] 
 
Females: 
Person : [ Name : Laura, Gender : Female, Marital Status : Married ] 
Person : [ Name : Diana, Gender : Female, Marital Status : Single ] 
 
Single Males: 
Person : [ Name : Robert, Gender : Male, Marital Status : Single ] 
Person : [ Name : Mike, Gender : Male, Marital Status : Single ] 
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ] 
 
Single Or Females: 
Person : [ Name : Robert, Gender : Male, Marital Status : Single ] 
Person : [ Name : Diana, Gender : Female, Marital Status : Single ] 
Person : [ Name : Mike, Gender : Male, Marital Status : Single ] 
Person : [ Name : Bobby, Gender : Male, Marital Status : Single ] 
Person : [ Name : Laura, Gender : Female, Marital Status : Married ] 


...
Рейтинг: 0 / 0
Friday pattern
    #38626457
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В java 8 все это будет выглядеть более лаконично
...
Рейтинг: 0 / 0
Friday pattern
    #38626466
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гониво какое-то. Любой адекватный разработчик знающий алгоритмы делает фильтры без
этой схемы так же легко как птица летает и рыба плавает. К чему нужно засорять себе
моск этими заумными диаграммами?
...
Рейтинг: 0 / 0
Friday pattern
    #38626595
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonГониво какое-то. Любой адекватный разработчик знающий алгоритмы делает фильтры без
этой схемы так же легко как птица летает и рыба плавает. К чему нужно засорять себе
моск этими заумными диаграммами?

Ваш пример . тут идет обсуждение примеров - фактически создание библиотеки классов помощников и общих подходов.
...
Рейтинг: 0 / 0
Friday pattern
    #38626758
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1maytonГониво какое-то. Любой адекватный разработчик знающий алгоритмы делает фильтры без
этой схемы так же легко как птица летает и рыба плавает. К чему нужно засорять себе
моск этими заумными диаграммами?

Ваш пример . тут идет обсуждение примеров - фактически создание библиотеки классов помощников и общих подходов.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class Filters{

 public static List<Person> getSignleOrFemale(List<Person> persons){
  List<Person> lp = new ....();

  for(Person person : persons){
   if(person.isSingle || person.isFemale)
    lp.add(person);
  }
  return lp;
 }

}
...
Рейтинг: 0 / 0
Friday pattern
    #38626783
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще профит, вместо List использовать Set.
...
Рейтинг: 0 / 0
Friday pattern
    #38633143
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
no56892Еще профит, вместо List использовать Set.

в реализации set = есть внутренняя проверка по ключу - это лишнее время .
Профит это или нет - нужно еще понять .
...
Рейтинг: 0 / 0
Friday pattern
    #38633583
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1no56892Еще профит, вместо List использовать Set.

в реализации set = есть внутренняя проверка по ключу - это лишнее время .
Профит это или нет - нужно еще понять .
Ну это да, но в тоже время при использовании фильтров Вы повторно отбираете значения, но уже в самом фильтре. И если учесть, что количество операций добавления заменто меньше чем получения через фильтр, то все-таки профит.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Friday pattern
    #39530776
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день

какой паттерн тут нужно применить ?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
@Data
public class Response<T> {

    private T result;
    private ApiError error;

    private BaseRpcResponse(MethodResult<T> result) {
        if(result.isSuccess())
            this.result = result.getResult();
        else
            this.error = result.getError();
    }

}
...
Рейтинг: 0 / 0
Friday pattern
    #39530862
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1какой паттерн тут нужно применить ?

Патерн "пустышка"?
Зачем?
Чем отличается Response и MethodResult?
...
Рейтинг: 0 / 0
Friday pattern
    #39530876
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TominПатерн "пустышка"?
Зачем?
Чем отличается Response и MethodResult?
Очевидно что это DTO, но, в целом, реализация так себе. Где гарантии что success синхронизирован с состоянием result/error? Зачем вообще условие, почему бы просто не присвоить оба?
...
Рейтинг: 0 / 0
Friday pattern
    #39530885
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MethodResult привожу


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
@Data
public class MethodResult<T> {

    private enum Status {
        SUCCESS, ERROR;
    }

    @Getter(AccessLevel.NONE)
    private Status status;
    private T result;
    private ApiError error;

    public boolean isSuccess(){
        return status == Status.SUCCESS;
    }

    private MethodResult(){}

    public static MethodResult success(Object result) {
        MethodResult methodResult = new MethodResult();
        methodResult.setStatus(Status.SUCCESS);
        methodResult.setResult(result);
        return methodResult;
    }

    public static MethodResult error(String error) {
        MethodResult methodResult = new MethodResult();
        methodResult.setStatus(Status.ERROR);
        methodResult.setError(new ApiError(error));
        return methodResult;
    }


}


...
Рейтинг: 0 / 0
Friday pattern
    #39530889
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любовь к if - else ?

как то лечится ?

нужно дать рекомендации по рефакторингу ... - как есть ,и как нужно ...


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
@Override
    public List<Document> document() {
        Map<String, BeanWithMethod> map = beanAnnotationMethods.getBeansAnnotatedMethods();
        List<Document> documents = new ArrayList<>();

        map.forEach((k,v)->{
            Document document = new Document();
            document.setMethodName(k);

            List<Parameter> Parameters = new ArrayList<>();
            for(Parameter parameter : v.getMethod().getParameters()){
                if(!parameter.getType().equals(User.class)) {
                    Parameter parameter = new Parameter();
                    parameter.setName(parameter.getName());
                    if(isSimpleObject(parameter.getType()))
                        parameter.setType(parameter.getType().getTypeName());
                    else if(isEnum(v.getMethod().getReturnType()))
                        parameter.setType("{" + Arrays.stream(v.getMethod().getReturnType().getEnumConstants())
                                .map(Object::toString)
                                .collect(Collectors.joining(", ")) + "}");
                    else
                        parameter.setParameters(getParamsFromComplexClass(parameter.getType()));
                    parameters.add(parameter);
                }
            }

            document.setInParams(parameters);

            Parameter outParam = new Parameter();
            outParam.setName("return");
            if(isSimpleObject(v.getMethod().getReturnType()))
                outParam.setType(v.getMethod().getReturnType().getSimpleName());
            else if(isEnum(v.getMethod().getReturnType()))
                outParam.setType("{" + Arrays.stream(v.getMethod().getReturnType().getEnumConstants())
                        .map(Object::toString)
                        .collect(Collectors.joining(", ")) + "}");
            else
                outParam.setParameters(getParamsFromMethod(v.getMethod()));


            document.setOutParam(outParam);

            documents.add(document);
        });

        return documents;
    }





прошу от троллинга воздержаться спасибо .

такой код тестами не покрыт , да и как ?

другое дело начать писать код через TDD - тогда в принципе такой стиль был бы не возможен
...
Рейтинг: 0 / 0
Friday pattern
    #39530910
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAlexey TominПатерн "пустышка"?
Зачем?
Чем отличается Response и MethodResult?
Очевидно что это DTO, но, в целом, реализация так себе. Где гарантии что success синхронизирован с состоянием result/error? Зачем вообще условие, почему бы просто не присвоить оба?


Присвоить оба - это видимо была идея - шаблона RESULT<T>

Книжная реализация :

The Result Data Transfer Object
The service layer will communicate with the request handling tier through
interfaces that return Result Data Transfer Objects (DTO). The DTO design
pattern is commonly used in enterprise application programming to transfer data
between different layers or subsystems. Our Result DTO will have the following
three properties:
• boolean success : This property is used if the action was successful and an
appropriate data payload is available
• String msg : This is a message that may be used by the client for logging or
informational purposes
• <T> data : This is a generically typed data payload that will be consumed by
the request handling layer
The Result class is also a Value Object (VO), an immutable object whose state
cannot be changed after creation. Each instance variable is marked final and we
will use an appropriate ResultFactory method to create the value object instance.
Value objects are a concept used in Domain-Driven Design to represent data without
any conceptual identity. You can find out more about Domain-Driven Design at
http://en.wikipedia.org/wiki/Domain-driven_design . The definition of the



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
package com.gieman.tttracker.vo;
  import java.io.Serializable;
  import java.util.List;
  import java.util.Objects;


public class Result<T> implements Serializable {
      final private boolean success;
      final private T data;
      final private String msg;

Result(boolean success, T data) {
   this.success = success;
   this.data = data;
   this.msg = null;
}

Result(boolean success, String msg) {
    this.success = success;
    this.data = null;
    this.msg = msg;
}

public boolean isSuccess() {
    return success;
}

public T getData() {
  return data;
}

public String getMsg() {
  return msg;
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
package com.gieman.tttracker.vo;
public class ResultFactory {
   public static <T> Result<T> getSuccessResult(T data) {
        return new Result(true, data);
   }


 public static <T> Result<T> getSuccessResult(T data, String msg) {
           return new Result(true, msg);
}

public static <T> Result<T> getSuccessResultMsg(String msg) {
     return new Result(true, msg);
 }

public static <T> Result<T> getFailResult(String msg) {
   return new Result(false, msg);
 }

}




...
Рейтинг: 0 / 0
Friday pattern
    #39531235
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Любовь к if - else ?

как то лечится ?Можно полиморфизмом или switch/case.
Atum1нужно дать рекомендации по рефакторингу ... - как есть ,и как нужно ...Что-во-что преобразуется? Можно посмотреть на исходные данные?Atum1прошу от троллинга воздержаться спасибоStream-ный код (:
...
Рейтинг: 0 / 0
Friday pattern
    #39531255
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Начну Сам :

Антипаттерн – публикация this в конструкторе
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class ThisEscape { 
... 
 public ThisEscape(EventSource source) { 
     source.registerListener(new EventListener() { 
                   public void onEvent(Event e) { 
                        doSomething(e); 
               } 
           }); 
 ... 
 } 
} 



решение - использовать фабричный метод :

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class SafeListener { 
     private final EventListener listener; 
     private SafeListener() { 
         listener = new EventListener() { 
                 public void onEvent(Event e) { 
                doSomething(e); 
          } 
         }; 
  } 

 public static SafeListener newInstance(EventSource source) { 
   SafeListener safe = new SafeListener(); 
   source.registerListener(safe.listener); 
 return safe; 
 } 
} 



Что-то я не догоняю, где здесь публикация this?
...
Рейтинг: 0 / 0
Friday pattern
    #39531275
Alexey Tomin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HettAtum1Антипаттерн – публикация this в конструкторе
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public class ThisEscape { 
... 
 public ThisEscape(EventSource source) { 
     source.registerListener(new EventListener() { 
                   public void onEvent(Event e) { 
                        doSomething(e); 
               } 
           }); 
 ... 
 } 
} 



Что-то я не догоняю, где здесь публикация this?

Реализация EventListener не статическая, значит содержит неявную ссылку на "оборачивающий" объект. Т.е. на this.
Т.е. в source передан объект со ссылкой на this.
...
Рейтинг: 0 / 0
Friday pattern
    #39531278
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Tomin,

понял, спасибо
...
Рейтинг: 0 / 0
79 сообщений из 79, показаны все 4 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Friday pattern
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]