Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Friday pattern / 25 сообщений из 79, страница 1 из 4
17.01.2014, 12:30
    #38529391
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Friday pattern
Из за того что интерес к Пятничным задачкам остыл - предлагаю новую тему -

Пятничный Паттрен - и так мы берем по порядку - один паттрен на 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
17.01.2014, 12:57
    #38529440
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Friday pattern
Начну Сам :

Антипаттерн – публикация 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
17.01.2014, 13:19
    #38529489
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Friday pattern
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
17.01.2014, 13:36
    #38529529
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Friday pattern
no56892,

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

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

((Circle)shape).getRadius();
...
Рейтинг: 0 / 0
17.01.2014, 13:50
    #38529558
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Friday pattern
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
17.01.2014, 14:15
    #38529606
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Friday pattern
Просьба!

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

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

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

И возможно еще что-нибудь.
...
Рейтинг: 0 / 0
17.01.2014, 14:18
    #38529617
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Friday pattern
chabapokВ часности, публикация this в конструкторе плоха тем, что если после публикации возникнет исключение, то обьект не будет удален сборщиком мусора...
Не понял.
...
Рейтинг: 0 / 0
17.01.2014, 14:30
    #38529633
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Friday pattern
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
17.01.2014, 14:36
    #38529644
no56892
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Friday pattern
Atum1,

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

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

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

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

ps. Профита от ShapeFactory в таком виде как приведено, тоже не вижу. Разве что эти строки "CIRCLE", "RECTANGLE" и тд приходят извне и известны только на этапе выполнения.
...
Рейтинг: 0 / 0
17.01.2014, 14:57
    #38529680
0FD
0FD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Friday pattern
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
17.01.2014, 15:11
    #38529714
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Friday pattern
Спасибо! корректное замечание!
chabapokПросьба!
Кроме того, при публикации this в другой поток, этот другой поток может вызывать методы в то время как в данном потоке еще не завершился конструктор.

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

Думаю это самое главное - в многопоточном программирование использование антипаттерна опасно.
...
Рейтинг: 0 / 0
17.01.2014, 15:16
    #38529729
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Friday pattern
Использование патерна хорошо видно на таком примере :
(тут нужно знать Модель памяти 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
17.01.2014, 15:28
    #38529753
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Friday pattern
Atum1Начну Сам :

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




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

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

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

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

Давайте так Вы сами - приведете пример! :) так будет лучше - для Вас .
...
Рейтинг: 0 / 0
17.01.2014, 15:37
    #38529770
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Friday pattern
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
17.01.2014, 15:42
    #38529777
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Friday pattern
MasterZiv,

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


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