728x90
싱글톤패턴
어플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당(static) 그 메모리에 인스터스를 만들어 사용
=> 하나의 인스턴스만을 생성하며, 필요할 때 마다 각자 알아서 기존의 인스턴스를 공유받아 생성
=>생성자가 여러번 호출되도 실제 생성되는 객체는 하나,
이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴
장점
- 한 번의 new로 객체생성이 가능하기 때문에 메모리 낭비방지
- 싱글톤으로 만들어진 클래스의 인스턴스는 전역이기 때문에 다른 클래스의 인스턴스들이 데이터 공유하기 쉬움
- 두번째 이용부터는 객체 로딩시간이 줄어 성능향상
단점
- 싱글톤인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유 시킬 경우 다른 클래스 인스턴스들 간의 결합도 증가
=>개방-폐쇄의 원칙 위반
더보기
개방-폐쇄 원칙 (OCP: Open-Closed Principle)
소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다.(Bertrand Mayer)
계방 폐쇄 원칙은 기존 코드를 변경하지 않으면서(Close) 기능을 추가(Open)할 수 있도록 설계가 되어야 한다는 원칙
이는 객체 지향 설계에 어긋나며 수정이 어려워지고 유지보수 비용이 높아질 수 있음
꼭 필요한 경우가 아니라면 지양
싱글톤 패턴 구현하기
package kr.or.ddit.basic.singleton;
/*
* singleton패턴 ==> 객체가 1개만 만들어지게 하는 방법
* (외부에서 new 명령을 사용하지 못하게 한다.)
*
* - 사용 목적 : 1.메모리 낭비 방지
2.데이터의 공유가 쉬움
- singleton클래스를 만드는 방법(필수 구성 요소)
* 1. 자신 class의 참조값이 저장될 변수를 private static을 선언한다.
단, 1개만 존재해야 해서 static 으로 선언
*
* 2. 생성자의 접근제한자를 private로 한다(외부에서 new명령어를 사용하지 못하게..)
* (기본 생성자만 있더라고 반드시 생성자를 작성해야 함.)
* 3. 자신 class인스턴스를 생성하고 반환하는 메서드를 public static으로 작성
* (이 메서드의 이름은 보통 getInstance로 함.)
*/
public class MySingleton {
//아래의 3가지는 필수!!!
//1번
private static MySingleton single;
//2번
private MySingleton(){
System.out.println("생성자 입니다....");
}
//3번
public static MySingleton getInstance() {
//1번에서 선언한 변수가 null이면 객체를 생성해서
//1번에서 선언한 변수에 저장.
if(single==null) single= new MySingleton();
return single;
}
//기타 이 클래스가 처리할 내용을 기술
public void test() {
System.out.println("이것은 싱글톤 객체의 메서드 실행입니다!!!");
}
}
package kr.or.ddit.basic.singleton;
public class SingletonTest {
//서비스와 DAO는 싱글톤으로 거의 생성
public static void main(String[] args) {
//MySingleton test1 = new MySingleton(); 외부에서 new 명령으로 생성불가
MySingleton test2 = MySingleton.getInstance();//객체생성
MySingleton test3 = MySingleton.getInstance();//객체생성
System.out.println("test2 ==> "+test2.toString());
System.out.println("test3 ==> "+test3);
System.out.println();
System.out.println(test2==test3);
System.out.println(test2.equals(test3));
test2.test();
test3.test();
}
}
MVC패턴에서 싱글톤패턴사용예제
public class MemberDaoImpl implements IMemberDao{
//1번
private static MemberDaoImpl dao;
//2번
private MemberDaoImpl() {}
//3번
public static MemberDaoImpl getInstance() {
if(dao==null) dao = new MemberDaoImpl();
return dao;
}
public class MemberServiceImpl implements IMemberService {
private IMemberDao dao; // DAO객체가 저장될 변수 선언
private static MemberServiceImpl service; //1번
//생성자
//public MemberServiceImpl () {
private MemberServiceImpl () { //2번
//dao = new MemberDaoImpl(); //DAO객체 생성
dao = MemberDaoImpl.getInstance();
}
public static MemberServiceImpl getInstance() {
if(service == null) service = new MemberServiceImpl();
return service;
}
public class MemberController {
private IMemberService service; // Service객체가 저장될 변수 선언
private Scanner sc = new Scanner(System.in);
public MemberController() {
//service = new MemberServiceImpl();
service = MemberServiceImpl.getInstance();
}
728x90
'ddit > Java' 카테고리의 다른 글
Swing (0) | 2022.09.05 |
---|---|
ibatis (0) | 2022.07.29 |
MVC패턴(model-view-controller)< VO,DAO,Service,Controller> (0) | 2022.07.26 |
Stack, Queue, Sort (0) | 2022.06.22 |
Collection Framework(Array List, Vector...), generic / 문제풀기 (0) | 2022.06.22 |