powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Friday pattern
25 сообщений из 79, страница 1 из 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
25 сообщений из 79, страница 1 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / Friday pattern
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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