2021.05.28 - [Back-End/Java_Spring] - [디자인패턴]Gof의 디자인패턴 (Gang of Four)
디자인 패턴_Detail_1
Singleton Pattern
- 어떠한 클래스(객체)가 유일하게 1개만 존재 할 때 사용한다.
- 실제 사물로는 여러 PC가 공유해서 사용 하는 프린터를 예로 들 수 있음
- 이를 주로 사용하는 곳은 TCP Socket 통신에서 서버와 연결 된 connect 객체에 주로 사용
- Aplication Context를 이용 해 Spring의 Bean을 싱글톤으로 관리 함
싱글톤 생성
package design.singlton;
public class SocketClient {
// static으로 인스턴스를 만들어 어디에서든 접근 할 수 있음
// 하지만 private이기 때문에 직접 사용은 불가
private static SocketClient socketClient = null;
// 생성자는 private이 기본 설정
private SocketClient() {
}
// static으로 getInstance 메서드를 만들어 어디에서든 호출 할 수 있음
public static SocketClient getInstance() {
// socketClient 인스턴스가 null이라면 생성하고 아니면 return
if(socketClient == null) {
socketClient = new SocketClient();
}
return socketClient;
}
}
AClass
package design.singlton;
public class Aclass {
private SocketClient socketClient;
public Aclass() {
this.socketClient = SocketClient.getInstance();
}
public SocketClient getSocketClient() {
return this.socketClient;
}
}
BClass
package design.singlton;
public class Bclass {
private SocketClient socketClient;
public Bclass() {
this.socketClient = SocketClient.getInstance();
}
public SocketClient getSocketClient() {
return this.socketClient;
}
}
Main
package design;
import design.singlton.Aclass;
import design.singlton.Bclass;
import design.singlton.SocketClient;
public class Main {
public static void main(String[] args) {
Aclass aclass = new Aclass();
Bclass bclass = new Bclass();
SocketClient aClient = aclass.getSocketClient();
SocketClient bClient = bclass.getSocketClient();
System.out.println("두 객체가 동일한가?");
System.out.println(aClient.equals(bClient));
}
}
Adapter Pattern
- 호환성이 없는 기존 클래스의 인터페이스를 변환하여 재 사용 할 수 있도록 한다
- SOLID 중 개방폐쇄의 원칙 (OCP)를 따른다.
110V => 220V 변환 예제
110V
package design.adapter;
public interface Electronic110V {
void powerOn();
}
220V
package design.adapter;
public interface Electronic220V {
void connect();
}
HairDryer (110V)
package design.adapter;
public class HairDryer implements Electronic110V{
@Override
public void powerOn() {
System.out.println("헤어 드라이기 110V on");
}
}
Cleanner (220V)
package design.adapter;
public class Cleanner implements Electronic220V{
@Override
public void connect() {
System.out.println("청소기 220V on");
}
}
SocketAdapter (110V => 220V)
package design.adapter;
public class SocketAdapter implements Electronic110V{
private Electronic220V electronic220V;
public SocketAdapter(Electronic220V electronic220V) {
this.electronic220V = electronic220V;
}
@Override
public void powerOn() {
electronic220V.connect();
}
}
Main
package design;
import design.adapter.AirConditioner;
import design.adapter.Cleanner;
import design.adapter.Electronic110V;
import design.adapter.HairDryer;
import design.adapter.SocketAdapter;
public class Main {
public static void main(String[] args) {
HairDryer hairDryer = new HairDryer();
connect(hairDryer);
Cleanner cleanner = new Cleanner();
// connect(cleanner); - 110v라 사용 불가
Electronic110V adapter = new SocketAdapter(cleanner);
connect(adapter);
AirConditioner airConditioner = new AirConditioner();
Electronic110V airAdapter = new SocketAdapter(airConditioner);
connect(airAdapter);
}
//어댑터
public static void connect(Electronic110V electronic110v) {
electronic110v.powerOn();
}
}
반응형
'공부 기록' 카테고리의 다른 글
[디자인패턴] 데코레이터 패턴(Decorator Pattern), 옵저버 패턴(Observer Pattern) (0) | 2021.06.03 |
---|---|
[디자인패턴] 프록시 패턴(Proxy Pattern) _ AOP (0) | 2021.06.03 |
[디자인패턴]Gof의 디자인패턴 (Gang of Four) (0) | 2021.05.28 |
[객체지향] 객체지향 4대 특성 및 5대 원칙 (0) | 2021.05.28 |
[JS] Ajax를 Axios로 변환하기 (0) | 2021.05.25 |
댓글