디자인 패턴, 저자 Gang of Four(Gof)
- Erich Gamma
- Richard Helm
- Ralph Johnson
- John Vlissides
디자인 패턴이란?
객체지향 개념에 따른 설계 중 재사용할 경우 유용한 설계를 디자인 패턴으로 정립한 것이다. 여기서 디자인 패턴이란 여러 가지 문제에 대한 설계 사례를 분석하여 서로 비슷한 문제를 해결하기 위한 설계들을 분류하고, 각 문제 유형별로 가장 적합한 설계를 일반화해 패턴으로 정립한 것을 의미한다.
싱글톤 패턴
인스턴스를 오직 한개만 제공하는 클래스
singleton 패턴은 객체의 생성과 관련된 패턴으로서 특정 클래스의 객체가 오직 한 개만 존재하도록 보장한다. 즉 클래스의 객체를 하나로 제한한다.
고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 막을 수 있고 이미 생성된 인스턴스를 활용하기 때문에 속도 측면에서도 이점이 있다.
<코드 구현>
public class App {
public static void main(String[] args) {
Settings settings = Settings.getInstance();
Settings settings1 = Settings.getInstance();
System.out.println(settings == settings1);
}
}
public class Settings {
private static Settings instance;
private Settings() {}
public static Settings getInstance() {
if(instance == null) {
instance = new Settings();
}
return instance;
}
}
위의 코드는 쓰레드 세이프 하지 않음
A,B 스레드가 있다고 했을 때 getInstance 함수를 A스레드가 if문을 지나고 B스레드도 인스턴스가 생성되기 전에 if문을 통과할 경우 A스레드와 B스레드에서 각각 다른 인스턴스가 생성된다.
※ 쓰레드 세이프란?
멀티 쓰레드 프로그래밍에서, 어떤 공유 자원에 여러 쓰레드가 동시에 접근해도, 프로그램 실행에 문제가 없는 상태
대처방법
1. synchronized 키워드를 사용하여 한번에 하나의 쓰레드만 접근하게 한다.
public class Settings {
private static synchronized Settings instance;
private Settings() {}
public static Settings getInstance() {
if(instance == null) {
instance = new Settings();
}
return instance;
}
}
2. 미리 선언 하기
public class Settings {
private static final Settings INSTANCE=new Settings();
private Settings() {}
public static Settings getInstance() {
return INSTANCE;
}
}
옵저버 패턴
다수의 객체가 특정 객체 상태 변화를 감지하고 알림을 받는 패턴
어떤 클래스에 변화가 일어났을 때, 이를 감지하여 다른 클래스에 통보해주는 것이 observer 패턴이다. 그림을 보면 이 패턴은 외부 객체의 상태 변화에 따라(subject 클래스) observer 객체(observer 인터페이스 클래스)는 이에 상속되어 있는 다른 객체들에게 변화된 상태를 전달하고 상속된 객체들은 그에 맞게 기능을 수행하는 형태로 구성된다.
이 패턴에 해당되는 예는 관심 있는 어떤 블로그를 미리 등록해놓으면 그 블로그에 새 글이 올라올 때마다 자동으로 알려주는 것과 같다. 즉 observer 패턴은 어떤 일이 생기면 미리 등록한 객체들에게 상태 변화를 알려주는 역할을 한다.
<코드 구현>
public class ChatServer {
private Map<String, List<Subscriber>> subscribers =new HashMap<>();
public void register(String subject, Subscriber subscriber) {
if(this.subscribers.containsKey(subject)) {
this.subscribers.get(subject).add(subscriber);
}else {
List<Subscriber> list=new ArrayList<>();
list.add(subscriber);
this.subscribers.put(subject,list);
}
}
public void unregister(String subject, Subscriber subscriber) {
if(this.subscribers.containsKey(subject)) {
this.subscribers.get(subject).remove(subscriber);
}
}
public void sendMessage(User user, String subject, String message) {
if(this.subscribers.containsKey(subject)) {
String userMessage = user.getName()+": "+message;
this.subscribers.get(subject).forEach(s-> s.handleMessage(userMessage));
}
}
}
public interface Subscriber {
void handleMessage(String message);
}
public class User implements Subscriber {
private String name;
public User(String name) {
this.name=name;
}
public String getName() {
return name;
}
@Override
public void handleMessage(String message) {
System.out.println(message);
}
}
public class Client {
public static void main(String[] args) {
ChatServer chatServer =new ChatServer();
User user1=new User("1");
User user2=new User("2");
chatServer.register("오징어", user1);
chatServer.sendMessage(user1, "오징어", "메시지");
}
}
<자바에서 제공하는 클래스로 옵저버 패턴 구현>
The type Observer is deprecated since version 9
???.....
참조
java9 Observer API deprecated 되는 이유-질문글
https://okky.kr/articles/705425
인프런 - 코딩으로 학습하는 GoF의 디자인(백기선)
[네이버 지식백과] Gof 디자인 패턴 (쉽게 배우는 소프트웨어 공학, 2015. 11. 30., 김치수)
[네이버 지식백과] observer 패턴 (쉽게 배우는 소프트웨어 공학, 2015. 11. 30., 김치수)
싱글톤 패턴 - 블로그
https://devmoony.tistory.com/43
싱글톤 패턴이란?
'안드로이드' 카테고리의 다른 글
안드로이드 webview bridge 실습 (0) | 2022.12.20 |
---|---|
안드로이드 학습 계획 (0) | 2022.11.21 |
안드로이드 WebView 구현 및 디버깅 (0) | 2022.11.13 |
모바일 앱 종류 (0) | 2022.11.04 |
안드로이드 개념 정리 (0) | 2022.11.01 |