디자인 모델 (3) - 공장 모델 (공장 방법 모델 + 추상 공장 모델)

더 읽 기
공장 모델: 구체 적 인 것 은 두 가지 로 나 눌 수 있 는데 그것 이 바로 공장 방법 모델, 추상 적 인 공장 모델 이다.
 
공장 방법 모델: 창설 대상 의 인 터 페 이 스 를 정 의 했 지만 하위 클래스 에서 실례 화 할 클래스 가 어느 것 인지 결정 하고 공장 방법 은 실례 화 를 하위 클래스 로 미 루 었 다.
디자인 원칙: 후진 원칙 에 의존 해 야 한다 (구체 적 인 유형 에 의존 하 는 것 이 아니 라 추상 에 의존 해 야 한다).
후진 원칙 에 의존 하 는 몇 가지 건 의 를 준수 합 니 다.
1. 변 수 는 구체 적 인 인용 을 가 져 서 는 안 됩 니 다. (new 를 사용 하면 구체 적 인 인용 을 가지 고 공장 으로 바 꾸 어 이런 방법 을 피 할 수 있 습 니 다)
2. 유형 을 구체 적 인 유형 에서 파생 시 키 지 마 세 요 (구체 적 인 유형 에서 파생 되면 구체 적 인 유형 에 의존 할 것 입 니 다. 추상 적 인 [인터페이스 또는 추상 적 인 유형] 에서 파생 하 십시오)
3. 기본 클래스 에서 실 현 된 방법 을 덮어 쓰 지 마 십시오. (기본 클래스 가 실 현 된 방법 을 덮어 쓰 면 기본 클래스 는 진정 으로 계승 에 적합 한 추상 이 아 닙 니 다. 기본 클래스 에서 실 현 된 방법 은 모든 하위 클래스 에서 공유 해 야 합 니 다)
 
 
비교적 좋 은 해석: http://blog.csdn.net/wyxhd2008/article/details/5597975
 
구체 적 인 공장 방법 모델 코드:
 
/**
 * Created by Administrator on 2017/12/9.
 *    
 */
public abstract class Pizza {
    protected String name;
    protected String dough;

    protected  void prepare(){
        System.out.println("prepare");
    }

    protected  void cut(){
        System.out.println("cut");
    }

    protected  void box(){
        System.out.println("box");
    }

}

 
/**
 * Created by Administrator on 2017/12/9.
 *    
 */
public abstract class PizzaStore {

    public Pizza orderPizza(String type) {
        Pizza pizza = createPizza(type); //        
        pizza.prepare();
        pizza.cut();
        pizza.box();
        return pizza;
    }

    /**
     *             Pizza
     * */
    protected abstract Pizza createPizza(String type);
}

 
 
/**
 * Created by Administrator on 2017/12/9.
 *       pizza
 */
public class CheesetPizza extends Pizza {

    public CheesetPizza() {
        this.name = "chesse";
        this.dough = "doughchesse";
    }

    @Override
    public String toString() {
        return "CheesetPizza " + this.name + ", " + this.dough;
    }
}

 
 
/**
 * Created by Administrator on 2017/12/9.
 *    pizzaStore
 */
public class NYStylePizzaStore  extends PizzaStore {
    @Override
    protected Pizza createPizza(String type) {
        Pizza pizza = null;
        if("Cheese".equals(type)){  //           pizza
            pizza = new CheesetPizza();
        }/*else if("clam".equals(type)){
            //     Pizza
        }*/

        return pizza;
    }
}

 
 
/**
 * Created by Administrator on 2017/12/9.
 */
public class TestFactoryMethod {
    public static void main(String[] args) {
        PizzaStore pizzaStore = new NYStylePizzaStore();
        Pizza pizza = pizzaStore.orderPizza("Cheese");
        System.out.println(pizza);
    }
}

 
 
 
 
 
추상 적 인 공장 모델: 인 터 페 이 스 를 제공 하여 관련 되 거나 의존 대상 의 가족 을 만 드 는 데 사용 되 며 구체 적 인 유형 을 명확 하 게 지정 할 필요 가 없습니다.
 
/**
 * Created by Administrator on 2017/12/9.
 */
public abstract  class Pizza {

    protected Dough dough;

    protected abstract void prepare();

    protected  void cut(){
        System.out.println("cut");
    }

    protected  void box(){
        System.out.println("box");
    }
}

 
public abstract class PizzaStore {

    public Pizza orderPizza(String type) {
        Pizza pizza = createPizza(type); //        
        pizza.prepare();
        pizza.cut();
        pizza.box();
        return pizza;
    }

    /**
     *             Pizza
     * */
    protected abstract Pizza createPizza(String type);
}

 
 
/**
 * Created by Administrator on 2017/12/9.
 * pizza    
 */
public interface PizzaIngredientFactory {
    Dough createDough();
}

 
/**
 * Created by Administrator on 2017/12/9.
 * pizza   [      ,       Dough]
 */
public class Dough {
    private String dough;

    public String getDough() {
        return dough;
    }

    public void setDough(String dough) {
        this.dough = dough;
    }
}

 
/**
 * Created by Administrator on 2017/12/9.
 */
public class CheesePizaa  extends  Pizza{

    private PizzaIngredientFactory pizzaIngredientFactory ;

    public CheesePizaa(PizzaIngredientFactory pizzaIngredientFactory) {
        this.pizzaIngredientFactory = pizzaIngredientFactory;
    }

    @Override
    protected void prepare() {
        this.dough = pizzaIngredientFactory.createDough();//         
    }
}

 
/**
 * Created by Administrator on 2017/12/9.
 */
public class NYPizzaStore extends PizzaStore {
    @Override
    protected Pizza createPizza(String type) {
        Pizza pizza = null;
        PizzaIngredientFactory pizzaIngredientFactory = new NYPizzaIngredientFactory();
        if("Cheese".equals(type)){
            pizza = new CheesePizaa(pizzaIngredientFactory);
        }/*else if("clam".equals(type)){

        }*/
        return pizza;
    }
}

 
/**
 * Created by Administrator on 2017/12/9.
 */
public class NYPizzaIngredientFactory implements PizzaIngredientFactory{
    @Override
    public Dough createDough() {
        return new Dough();
    }
}

 
 
 
 
 
 
 

좋은 웹페이지 즐겨찾기