Hyemi Lee

Hyemi Lee

주니어 개발자의 삽질과 기록

JAVA, 디자인 패턴, 싱글톤/전략/어댑터/템플릿메소드/팩토리메소드

내 코드 확인하기

Singleton Patteren

  • 인스턴스가 프로그램 내에서 오직 하나만 생성
  • 프로그램 어디에서든 이 인스턴스에 접근할 수 있다.

장점

  • 전체 클래스에서 한개만 생성되므로 메모리 아낄수있다
  • 다른 객체들과 공유 용이

    단점

  • 싱글톤으로 만든 객체가 복잡하다면, 객체간 결합도가 높아진다.

예시

 //Calendar cal = new Calendar();
 // 컴파일 에러. 달력은 이미 만들어진 한개의 달력을 참조만할수있다.
 Calendar calendar = Calendar.getInstance();
 calendar.getTime();	// Calendar의 여러 메소드 사용 가능

구현

public class Company {
	private static Company instance = new Company();
	// 전체에서 사용될 유일한 인스턴스
	// 함부로 변경되면 안되므로 private로 선언
	// 단 하나의 값만을 가져야 하므로 static으로 선언
	// private 이므로 해당 클래스에서만 생성가능하다
	private Company() {}
	// 객체를 생성하지 않고 해당 인스턴스를 부르고 싶어서 static으로 선언한다
	public static Company getInstace() {
		if (instance == null)
			instance = new Company();
		return instance;
	}
}
public class CompanyTest {
	public static void main(String[] args) {
		Company c1 = Company.getInstace();
		Company c2 = Company.getInstace();
		// 주소 값이 같다
		System.out.println(c1+" "+c2);
	}
}

Strategy Patteren

  • OOP 5원칙의 Open-Close 법칙의 대표적인 예
  • 기존코드는 변경X, 쉽게 확장O
  • 객체들의 공통점을 캡슐화 , 객체의 행위를 변경하기 원하면 전략을 바꿔 유연하게 확장 전략패턴

전략패턴 참고

Adapter Patteren

  • 어댑터를 이용하면 호환될수 없던 클래스를 연결해서 사용가능
  • 기존시스템 + 어댑터 + 업체에서 제공한 클래스
  • 기존 클래스의 코드 수정X , 타겟 인터페이스에 맞춰 동작을 가능하게 한다. 어댑터패턴

어댑터패턴 참고

Template Method Patteren

  • 코드의 중복을 줄이기 위해, 하위class에서 빈번,공통으로 나타나는 부분을 별도의 추상 클래스에 정의해서 사용
  • 구현별로 달라질 수 있는 메소드를 구현 클래스에서 선언 후 호출
  • 추상 클래스를 이용한다 (하위 클래스에서 기능의 확장에 용이 !)

장점

  • 코드 중복 감소
  • 자식 class의 역할 감소, 핵심로직 관리 용이
  • 객체 추가 및 확장 용이

단점

  • 추상메소드가 많아지면 클래스 관리 복잡
  • 추상클래스와 구현클래스간 복잡성 증대

구조

템플릿메소드패턴

결과

템플릿메소드패턴2

템플릿 메소드 패턴 참고

Factory Method Patteren

  • 객체 생성을 대신 수행해주는 공장 (간접적으로 객체 생성 후 반환)
  • 기반 클래스 코드에 구체 클래스의 이름을 감추는 방법

    장점

  • 생성할 클래스를 미리 몰라도 팩토리 클래스가 객체 생성
  • 객체의 자료형이 하위클래스에 의해 결정

단점

  • 객체가 늘어날 때 마다 하위클래스 재정의로 인한 불필요한 많은 클래스 생성 가능

팩토리 메서드 패턴

package FactoryMethod;
public class ShapeFactory {
	// 팩토리 메소드 - 객체 생성 후 반환
	public Shape getShap(String shapeType) {
		if(shapeType==null)
			return null;
		if(shapeType.equalsIgnoreCase("CIRCLE")){
			return new Circle();
 } 
		else if(shapeType.equalsIgnoreCase("RECTANGLE")){
			return new Rectangle();
 }
		return null;
	}
}

팩토리 패턴 참고

Share on

Twitter Facebook LinkedIn

You may also enjoy

Redis Stream

2021年04月28日

Stream Stream은 로그 데이터를 처리하게위해 5.0에서 새로 도입된 데이터 타입입니다. 대량의 데이터가 연속적으로 발생할때 처리하기 위해 등장했습니다. 기존 데이터를 수정하지 않고 오직 추가로 발생합니다. 이런 종류의 데이터를 stream or log데이터...

Study, Object, chapter2&3 presentation

2021年04月20日

chapter03. 역할, 책임, 협력 객체지향 설계란, 올바른 객체에게 올바른 책임을 할당하면서 낮은 결합도와 높은 응집도를 가진 구조를 창조하는 활동이다.

Spring, chatting 프로그램 만들기, Reactive란?

2020年06月16日

Reactive 막힘없이 흘러다니는 data(event)를 통해 사용자에게 자연스러운 응답을 주고 규모 탄력적으로 리소스를 사용하며 실패에 있어서 유연하게 대처한다 모든 지점에서 블럭 되지 않게 하자 oop와 같은 패러다임 모든 것을 비동기적인 data의 strea...