Chapter 04 Factory Method 하위 클래스에서 인스턴스 만들기 - brodieroy/Study GitHub Wiki

1. 무작정 소스를 다운받아서 봅시다. A2, Sample 가 있더군요.

2. Sample2을 봅시다.

Factory.java

package FactoryMethod.Sample.framework;

public abstract class Factory {
    public final Product create(String owner) {
        Product p = createProduct(owner);
        registerProduct(p);
        return p;
    }
    protected abstract Product createProduct(String owner);
    protected abstract void registerProduct(Product product);
}

Product.java

package FactoryMethod.Sample.framework;

public abstract class Product {
    public abstract void use();
}

IDCard.java

package FactoryMethod.Sample.idcard;
import FactoryMethod.Sample.framework.*;

public class IDCard extends Product {
    private String owner;
    IDCard(String owner) {
        System.out.println(owner + "의 카드를 만듭니다.");
        this.owner = owner;
    }
    public void use() {
        System.out.println(owner + "의 카드를 사용합니다.");

    }
    public String getOwner() {
        return owner;
    }
}

IDCardFactory.java

package FactoryMethod.Sample.idcard;
import FactoryMethod.Sample.framework.*;
import java.util.*;

public class IDCardFactory extends Factory {
    private List owners = new ArrayList();
    protected Product createProduct(String owner) {
        return new IDCard(owner);
    }
    protected void registerProduct(Product product) {
        owners.add(((IDCard)product).getOwner());
    }
    public List getOwners() {
        return owners;
    }
}

Main.java

package FactoryMethod.Sample;

import FactoryMethod.Sample.framework.*;
import FactoryMethod.Sample.idcard.*;

public class Main {
    public static void main(String[] args) {
        Factory factory = new IDCardFactory();
        Product card1 = factory.create("김-URBAN");
        Product card2 = factory.create("양-PARENTAL");
        Product card3 = factory.create("김-TECH");
        card1.use();
        card2.use();
        card3.use();
    }
}