[자바 디자인패턴 소스코드] Factory Pattern

펙토리 패턴

/**
 * 팩토리패턴은 객체를 생성하는 코드를 별도의 클래스/매서드로 분리함으로써
 * 객체 생성 방식의 변화에 대비하는 데 유용하다.
 */
public class FactoryPattern {
    public static void main(String[] args) {
        FactoryManager benz = new BenzFactory();
        benz.requestProduct(10, PRODUCT.SUV);
        benz.requestProduct(10, PRODUCT.TRUCK);

        FactoryManager bmw = new BmwFactory();
        bmw.requestProduct(5, PRODUCT.SEDAN);
    }
}

/**
 * Creator
 */
abstract class FactoryManager {

    public FactoryManager() {
        System.out.print("Factory_");
    }

    /**factoryMethod()*/
    protected abstract Brand getBrand();

    /**anOperation()*/
    public void requestProduct(int count, PRODUCT product) {
        Brand brand = getBrand();
        brand.makeProduct(this, count, product);
    }
}

/**
 * ConcreteCreator 01
 */
class BenzFactory extends FactoryManager {
    public BenzFactory() {
        super();
        System.out.println("Benz activated.");
    }

    /**factoryMethod()*/
    @Override
    protected Brand getBrand() {
        Brand brand = Benz.getInstance();
        return brand;
    }
}

/**
 * ConcreteCreator 02
 */
class BmwFactory extends FactoryManager {
    public BmwFactory() {
        super();
        System.out.println("Bmw activated.");
    }

    /**factoryMethod()*/
    @Override
    protected Brand getBrand() {
        Brand brand = Bmw.getInstance();
        return brand;
    }
}

/**
 * Product
 */
interface Brand {
    void makeProduct(FactoryManager manager, int count, PRODUCT product);
}

/**
 * ConcreteProduct 01
 */
class Benz implements Brand {
    private static Brand brand;
    private Benz(){}

    public static Brand getInstance() {
        if(brand == null) {
            brand = new Benz();
        }

        return brand;
    }

    @Override
    public void makeProduct(FactoryManager manager, int count, PRODUCT product) {
        System.out.println("\t-" + manager.getClass().getSimpleName() + ": " + product.getValue() + " " + count);
    }
}

/**
 * ConcreteProduct 02
 */
class Bmw implements Brand {
    private static Brand brand;
    private Bmw(){}

    public static Brand getInstance() {
        if(brand == null) {
            brand = new Bmw();
        }

        return brand;
    }

    @Override
    public void makeProduct(FactoryManager manager, int count, PRODUCT product) {
        System.out.println("\t-" + manager.getClass().getSimpleName() + ": " + product.getValue() + " " + count);
    }
}

enum PRODUCT {
    SEDAN("Sedan"), TRUCK("Truck"), SUV("SUV");

    private String value;
    private PRODUCT(String value) {
        this.value = value;
    }
    public String getValue() {
        return this.value;
    }
}

이 글을 공유하기

댓글

Designed by JB FACTORY