1. 싱글톤 패턴 (Singleton pattern)
프로그램에서 인스턴스가 단 한개만 생성되어야 하는 경우 사용되는 디자인 패턴
2. 싱글톤 패턴으로 클래스 구현
public class Company { # 싱글톤 패턴 적용 객체
private static Company instance = new Company(); # 하나의 인스턴스(자신의 class 인스턴스)를 private, static으로 생성 (인스턴스를 생성할수 없게 static, 인스턴스로 접근이 불가능 하므로 클래스 변수 static)
private Company() {} # 외부에서 인스턴스를 생성할 수 없도록 pritvate으로 디폴트 생성자 정의
public static Company getInstance() { # 외부에서 객체에 접근할 수 있도록 get 메서드 제공
if( instance == null) {
instance = new Company();
}
return instance;
}
3. 싱글톤 패턴 클래스 접근
Company company1 = Company.getInstance();
Company company2 = Company.getInstance();
System.out.println(company1); # 결과 동일 (같은 주소)
System.out.println(company2); # 결과 동일 (같은 주소)
4. 싱글톤 패턴으로 구현된 클래스의 클래스 다이어그램
1. 싱글톤 패턴 실습
public class CarFactoryTest {
public static void main(String[] args) {
CarFactory factory = CarFactory.getInstance();
Car mySonata = factory.createCar();
Car yourSonata = factory.createCar();
System.out.println(mySonata.getCarNum()); //1000 출력
System.out.println(yourSonata.getCarNum()); //1001 출력
}
}
2. 내가 짠 코드
# Car 클래스
class Car{
private int carNum;
public Car(int carNum) {
this.carNum = carNum;
}
public int getCarNum() {
return carNum;
}
public void setCarNum(int carNum) {
this.carNum = carNum;
}
}
# CarFactory 클래스
public class CarFactory {
private static CarFactory factory = new CarFactory();
private int carSerialNum = 1000;
private CarFactory(){}
public static CarFactory getInstance() {
return factory;
}
public Car createCar(){
Car carInstance = new Car(carSerialNum);
carSerialNum++;
return carInstance;
}
}
3. 답안 코드
# Car 클래스
public class Car {
private static int serialNum = 999;
private int carNum;
public Car() {
serialNum++;
carNum = serialNum;
}
public int getCarNum() {
return carNum;
}
public void setCarNum(int carNum) {
this.carNum = carNum;
}
}
# CarFactory 클래스
public class CarFactory {
private static CarFactory instance = new CarFactory();
private CarFactory() {}
public static CarFactory getInstance() {
if(instance == null) {
instance = new CarFactory();
}
return instance;
}
public Car createCar() {
Car car = new Car();
return car;
}
}