자주 사용하는 설계 패턴을 정형화하여 이를 유형별로 가장 최적의 방법으로 개발할 수 있도록 정해둔 설계
알고리즘과 유사하지만 명확한 정답이 있는 형태는 아니며 프로젝트의 상황에 맞추어 적용한다.
객체지향 개념에 따른 설계 중 재사용할 경우 유용한 설계를 디자인패턴으로 정리해둔 것
총 23개의 패턴이 있으며 생성패턴, 구조패턴, 행위패턴으로 구분 가능하다.
객체를 생성하는 것과 관련된 패턴. 객체의 생성과 변경이 전체 시스템에 미치는 영향을 최소화하고 코드의 유연성을 높여준다.
프로그램 내의 자료구조나 인터페이스 구조 등 프로그램 구조를 설계하는데 활용될 수 있는 패턴
클래스, 객체들의 구성을 통해서 더 큰 구조를 만들 수 있게 해준다.
큰 규모의 시스템에서는 많은 클래스들이 서로 의존성을 가지게 되는데, 이런 복잡한 구조를 개발하기 쉽게 만들어주고 유지보수를 쉽게 해준다.
반복적으로 사용되는 객체들의 상호작용을 패턴화한 것
클래스나 객체들이 상호작용하는 방법과 책임을 분산하는 방법을 제공한다. 행위패턴은 행위 관련 패턴을 사용하여 독립적으로 일을 처리하고자할 때 사용한다.
어떤 클래스가 유일하게 하나만 존재할 때 사용한다.
주로 서로 자원을 공유할 때 사용한다. 실물 세계에서는 프린터를 생각하면 된다. 실제 프로그래밍에서는 TCP Socket 통신에서 서버와 연결된 connect 객체에 주로 사용한다. 또는 스프링의 빈
SocketClient.java
package com.company.designPattern.singleton;
public class SocketClient {
private static SocketClient socketClient = null;
// default 생성자 막기
private SocketClient() {
}
public static SocketClient getInstance() {
if (socketClient == null) {
socketClient = new SocketClient();
System.out.println("socket new instance");
}
return socketClient;
}
public void connect() {
System.out.println("socket");
}
}
AClazz.java
package com.company.designPattern.singleton;
public class AClazz {
private SocketClient socketClient;
public AClazz() {
this.socketClient = SocketClient.getInstance();
}
public SocketClient getSocketClient() {
return socketClient;
}
public void setSocketClient(SocketClient socketClient) {
this.socketClient = socketClient;
}
}
BClazz.java
package com.company.designPattern.singleton;
public class BClazz {
private SocketClient socketClient;
public BClazz() {
this.socketClient = SocketClient.getInstance();
}
public SocketClient getSocketClient() {
return socketClient;
}
public void setSocketClient(SocketClient socketClient) {
this.socketClient = socketClient;
}
}
Main.java
package com.company.designPattern;
import com.company.designPattern.singleton.AClazz;
import com.company.designPattern.singleton.BClazz;
import com.company.designPattern.singleton.SocketClient;
public class Main {
public static void main(String[] args) {
AClazz aClazz = new AClazz();
BClazz bClazz = new BClazz();
SocketClient aClient = aClazz.getSocketClient();
SocketClient bClient = bClazz.getSocketClient();
System.out.println("두 객체는 동일한가?");
System.out.println(aClient.equals(bClient));
}
}
출력은 true