Factory
목적
◎ 객체 생성을 캡슐화한다.
◎ 클라이언트 코드로부터 객체 생성 로직을 분리하는 것이 주된 목적이다.
특징
◎ 클라이언트 코드는 객체를 직접 생성하는 대신에 팩토리에게 객체 생성을 요청하고,
팩토리는 요청에 맞는 객체를 반환한다.
◎ 객체 생성 로직을 숨기기 때문에 클라이언트 코드는 객체의 구체적인 클래스에 대한 지식이 없어도 된다.
◎ 인터페이스를 사용하여 여러 종류의 객체를 생성할 수 있다.
예제 코드
// 인터페이스: 생성될 객체의 공통 동작을 정의합니다.
public interface Shape {
void draw();
}
// 구체적인 클래스: 인터페이스를 구현하여 도형을 그리는 방법을 정의합니다.
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing Circle");
}
}
// 구체적인 클래스
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Drawing Square");
}
}
// 팩토리 클래스: 객체 생성을 캡슐화합니다.
public class ShapeFactory {
// 객체 생성 메서드: 클라이언트 코드로부터 도형의 종류를 받아 해당하는 객체를 생성합니다.
public Shape createShape(String shapeType) {
if (shapeType.equalsIgnoreCase("Circle")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("Square")) {
return new Square();
}
return null; // 지정된 도형이 없는 경우 null 반환
}
}
// 클라이언트 코드: 팩토리를 사용하여 도형을 생성합니다.
public class Main {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory();
// 팩토리를 사용하여 Circle 객체 생성
Shape circle = shapeFactory.createShape("Circle");
// Circle 객체의 draw 메서드 호출
circle.draw();
// 팩토리를 사용하여 Square 객체 생성
Shape square = shapeFactory.createShape("Square");
// Square 객체의 draw 메서드 호출
square.draw();
}
}
Singleton
목적
◎ 클래스의 인스턴스가 오직 하나만 생성되도록 보장하는 것이 주된 목적이다.
특징
◎ 인스턴스가 오직 하나만 존재하도록 하여 전역적으로 접근할 수 있는 유일한 객체를 제공한다.
예제 코드
public class Singleton {
// 유일한 인스턴스를 저장하기 위한 정적 변수
private static Singleton instance;
// 생성자를 private으로 선언하여 외부에서 인스턴스를 직접 생성하지 못하도록 합니다.
private Singleton() {}
// 인스턴스를 반환하는 정적 메서드
public static Singleton getInstance() {
// 인스턴스가 생성되지 않은 경우에만 인스턴스를 생성합니다.
if (instance == null) {
instance = new Singleton();
}
// 이미 생성된 인스턴스를 반환합니다.
return instance;
}
// 기타 메서드들...
}
public class Main {
public static void main(String[] args) {
// 인스턴스 얻기
Singleton singleton = Singleton.getInstance();
// singleton 객체를 사용하여 작업 수행
}
}