public class Company {
private static Company instance = new Company();
// 정적 필드를 하나 선언하고 자신의 객체를 생성해 초기화 한다
// 정적 필드도 private 접근 제한자를 붙여 외부에서 필드값을
//변경하지 못하도록 막는다.
private Company() {
}
// 싱글톤을 만들려면 클래스 외부에서 new 연산자로 생성자를 호출
//할 수 없도록 막아야한다. 생성자를 호출한 만큼객체가 생성되기 때문이다.
public static Company getInstance() {
if( instance == null ) {
instance = new Company();
}
return instance;
}
// 외부에서 호출할 수 있는 정적 메소드인 getInstance()를 선언하고
// 정적 필드에서 참조하고 있는 자신의 객체르 리턴해준다.
// 외부에서 객체를 얻는 유일한 방법은 getInstance() 메소드를 호출하는 것
}
public static void main(String[] args) {
Company company1 = Company.getInstance();
Company company2 = Company.getInstance();
System.out.println(company);
System.out.println(company2); //같은 주소값이 나옴
}
Company는 외부에서 생성할 수도 없고 내부에서 private으로 생성되어있고 getInstance메서드만 제공되기 때문에 이 메서드로 return으로 instance만 사용할 수 있다.
-> 유일한 객체를 제공할 때 싱글톤 패턴을 쓴다. (static을 사용해 쓸 수 있다)
설명에 따른 객체를 구현하여 테스트 코드가 실행되도록 구현하기
- 자동차 공장이 있습니다. 자동차 공장은 유일한 객체이고, 이 공장에서 생산되는 자동차는 제작될 때 마다 고유의 번호가 부여됩니다.
- 자동차 번호가 10001번부터 시작되어 자동차가 생산될 때마다 10002, 10003 이렇게 번호가 붙도록 자동차 공장 클래스, 자동차 클래스를 구현하세요.
public class CarFactoryTest {
public static void main(String[] args) {
CarFactory factory = CarFactory.getInstance();
Car myCar = factory.createCar();
Car yourCar = factory.createCar();
System.out.println(myCar.getCarNum());
System.out.println(yourCar.getCarNum());
}
}
public class CarFactory {
private CarFactory() {
}
private static CarFactory instance = new CarFactory();
public static CarFactory getInstance() {
if(instance == null) {
instance = new CarFactory();
}
return instance;
}
public Car createCar() {
Car car = new Car();
return car;
}
}
public class Car{
private static int serialNum = 10000;
int CarNum;
public Car() {
serialNum++;
CarNum = serialNum;
}
public int getCarNum() {
return CarNum;
}
}