본문 바로가기

개발 패턴/Factory

[개발패턴] <Factory> Singleton과의 차이

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 객체를 사용하여 작업 수행
    }
}