Head First 디자인 모델 - 단순 공장, 공장, 추상 공장

9697 단어
앞에서 말 했 듯 이 관례 에 따라 저 는 Head First 디자인 모델 의 공장 모델 예 로 인 코딩 학습 을 시 작 했 습 니 다.그리고 간단 한 공장, 공장 모델, 추상 적 인 공장 모델 에서 순서대로 변화 하여 그들의 공통점 과 차이 점 을 요약 한다.
헤드 퍼스트 는 간단 한 공장 이 디자인 모델 이 아니 라 프로 그래 밍 습관 이 라 고 생각 하지만 우리 가 그것 을 사용 하 는 데 방해 가 되 지 않 는 다 고 생각 합 니 다. 그 다음 에 우 리 는 공장 모델 에 대해 끝까지 알 아 보 겠 습 니 다.
1. 피자 집 예
우선 우 리 는 피자 가 게 를 열 어야 한다. 업무 가 복잡 하지 않 은 상황 에서 우 리 는 피자 가게 와 피 자 를 주문 하 는 논 리 를 신속하게 개발 할 수 있다.
    public Pizza OrderPizza() {
            Pizza pizza = new Pizza();

            pizza.Prepare();
            pizza.Bake();
            pizza.Cut();
            pizza.Box();
            return pizza;
        }
    }

    public  class Pizza {
        //  
        public void Prepare() { }
        //  
        public void Bake() { }
        //  
        public void Cut() { }
        //  
        public void Box() { }
    }

     만약 에 우리 가 더 많은 피자 종 류 를 가지 고 있다 면 피 자 를 추상 류 로 정의 해 야 할 것 이다. 주문 한 피자 종류 에 따라 서로 다른 피 자 를 되 돌려 주 고 우 리 는 피 자 를 추상 적 이 고 Order 를 개조 해 야 한다.
    public class PizzaStore
    {
        public Pizza OrderPizza(string type)
        {
            Pizza pizza=null;
            if (type == "cheese")
            {
                pizza = new CheesePizza();
            }
            else if (type == "viggie") {
                pizza = new VeggiePizza();
            }
            //else if ......
            pizza.Prepare();
            pizza.Bake();
            pizza.Cut();
            pizza.Box();
            return pizza;
        }
    }

    public abstract class Pizza
    {
        //  
        public void Prepare() { }
        //  
        public void Bake() { }
        //  
        public void Cut() { }
        //  
        public void Box() { }
    }

    //    
    public class CheesePizza : Pizza
    {
    }
    //    
    public class VeggiePizza : Pizza
    {
    }

   피자 종 류 를 늘 리 거나 피 자 를 제거 하면 피자 가 게 를 수정 할 것 이 라 고 생각 했 을 것 이다.
   디자인 원칙 은 확장 에 개방 하고 수정 에 대해 닫 습 니 다.우 리 는 피 자 를 만 드 는 변 화 를 포장 해 야 한다.이에 피 자 를 전문 적 으로 만 드 는 '공장' 류 를 만 들 었 다.
   그리고 정적 을 사용 하면 실례 화 대상 이 필요 없고 프로 그래 밍 을 실현 하지 않 는 원칙 도 따른다.
 public class PizzaStore
    {
        public Pizza OrderPizza(string type)
        {
            Pizza pizza = SimplePizzaFactory.CreatePizza(type);

            pizza.Prepare();
            pizza.Bake();
            pizza.Cut();
            pizza.Box();
            return pizza;
        }
    }

    public static class SimplePizzaFactory {
        public static Pizza CreatePizza(string type) {
            Pizza pizza = null;
            if (type == "cheese")
            {
                pizza = new CheesePizza();
            }
            else if (type == "viggie")
            {
                pizza = new VeggiePizza();
            }
            return pizza;
        }
    }

이렇게 피 자 를 만 드 는 간단 한 포장 즉 간단 한 공장 (정태 공장) 이 고 간단 한 공장 도 정태 류 를 사용 하지 않 아 도 되 지만 간단 한 공장 은 전문 적 인 디자인 모델 이 아니다 (가끔 헷 갈 릴 수도 있 고 이것 이 바로 '공장 모델' 이 라 고 생각 할 수도 있다).우 리 는 평소에 프로 그래 밍 을 할 때 하 는 습관 과 같다. 우 리 는 부분 적 으로 변화 가 있 을 때 이 공장 류 만 수정 해 야 한다.
2, 더 많은 피자 가게
지금 우 리 는 미국 스타일 피자 가게 (USSytlePizza Store), 중국 스타일 피자 가게 (CHNSytle Pizza Store) 등 더 많은 피자 가 게 를 열 려 고 한다.
우 리 는 간단 한 공장 모델 로 서로 다른 스타일 의 피자 공장 을 만 든 다음 에 서로 다른 스타일 의 피자 가 게 를 만 들 고 서로 다른 스타일 의 피자 가 게 는 해당 하 는 피자 공장 을 사용 하여 얻 을 수 있다.
하지만 우리 의 변 화 는 피자 점 이다. 피자 점 의 구조 나 절 차 는 일정한 규칙 에 따라 서로 다른 스타일 의 피자 일 뿐 이 기 를 바란다. 이때 우 리 는 더 좋 은 해결 방법 이 있다. 공장 모델 이다.
이제 어떻게 이 루어 질 지 봅 시다.
    public abstract class PizzaStore
    {
        public Pizza OrderPizza(string type)
        {
            Pizza pizza= CreatePizza(type);
            

            pizza.Prepare();
            pizza.Bake();
            pizza.Cut();
            pizza.Box();
            return pizza;
        }

        public abstract Pizza CreatePizza(string type);
    }

    public class USSytlePizzaStore : PizzaStore
    {
        public override Pizza CreatePizza(string type)
        {
            Pizza pizza = null;
            if (type == "cheese")
            {
                pizza = new USStyleCheesePizza();
            }
            else if (type == "viggie")
            {
                pizza = new USStyleVeggiePizza();
            }
            return pizza;
        }
    }

    public class CHNSytlePizzaStore : PizzaStore
    {
        public override Pizza CreatePizza(string type)
        {
            Pizza pizza = null;
            if (type == "cheese")
            {
                pizza = new CHNStyleCheesePizza();
            }
            else if (type == "viggie")
            {
                pizza = new CHNStyleVeggiePizza();
            }
            return pizza;
        }
    }

    //US    
    public class USStyleCheesePizza : Pizza
    {
    }
    //US    
    public class USStyleVeggiePizza : Pizza
    {
    }

    //CHN    
    public class CHNStyleCheesePizza : Pizza
    {
    }
    //CHN    
    public class CHNStyleVeggiePizza : Pizza
    {
    }

   실현 을 통 해 우 리 는 피자 스토어 를 추상 류 로 수정 하고 서로 다른 피자 가게 가 추상 류 를 계승 하여 자신의 서로 다른 스타일 의 피자 로 돌아 가 는 것 을 볼 수 있다.
   이렇게 디자인 한 후에 제품 을 추가 하면 우 리 는 구체 적 인 서브 피자 가게 에서 그 중의 피 자 를 수정 하여 만 들 었 을 뿐 피자 가게 자체 의 절차 와 다른 피자 가게 의 실현 에 영향 을 주지 않 을 것 이다.
  공장 방법 모델: 창설 대상 의 인 터 페 이 스 를 정 의 했 습 니 다. 하위 클래스 에서 실례 화 할 클래스 가 어느 것 인지 결정 하고 공장 방법 은 실례 화 를 하위 클래스 로 미 루 도록 합 니 다.
  공장 방법 과 간단 한 공장 의 차이 점: 공장 방법의 자 류 는 간단 한 공장 처럼 보인다. 간단 한 공장 은 모든 일 을 한 곳 에서 처리 하고 공장 방법 은 하나의 틀 을 만들어 서 자 류 를 어떻게 실현 할 것 인 가 를 결정 한다.
3, 피자 의 다른 원료
서로 다른 스타일 의 피자 가게 에는 서로 다른 스타일 의 피자 가 있 는데 이런 피자 들 의 서로 다른 스타일 은 서로 다른 원료 로 만들어 진 것 이기 때문에 서로 다른 스타일 의 피자 변화 부분 은 재료 이다.
우 리 는 먼저 원료 와 원료 공장 을 짓 고 중국 피자 원료 공장 을 예 로 들 었 다.
//        
public interface PizzaIngredientFactory {
        public Veggie CreateVeggie();
        public Cheese CreateCheese();
    }
//      
public class CNHPizzaIngredientFactory : PizzaIngredientFactory
    {
        public Cheese CreateCheese()
        {
            return new CHNCheese();
        }

        public Veggie CreateVeggie()
        {
            return new CHNVeggie();
        }
    }

    public abstract class Veggie
    {
    }
    public class USVeggie : Veggie { 
    }
    public class CHNVeggie : Veggie { 
    }

    public abstract class Cheese
    {
    }
    public class USCheese : Cheese
    {
    }
    public class CHNCheese : Cheese
    {
    }

  
그리고 다시 피자.
    public abstract class Pizza
    {
        public String Name;
        Veggie veggie;
        Cheese cheese;
        //  
        public abstract void Prepare();
        //  
        public void Bake() { }
        //  
        public void Cut() { }
        //  
        public void Box() { }
    }

원 료 를 넣 은 추상 베 지 와 치즈, 그리고 우 리 는 prepare 를 추상 적 인 방법 으로 만 들 었 고 그의 구체 적 인 자 류 는 어떤 재료 로 서로 다른 스타일 의 피 자 를 만 들 지 결정 했다. 이 어 우 리 는 자 류 를 다시 만 들 었 다. Cheese Pizza 를 예 로 들 자. 
    //    
    public class CheesePizza : Pizza
    {
        PizzaIngredientFactory IngredientFactory;
        public CheesePizza(PizzaIngredientFactory IngredientFactory) {
            this.IngredientFactory = IngredientFactory;
        }
        public override void Prepare()
        {
            IngredientFactory.CreateCheese();
        }
    }

중국 피자 집 수정
     public class CHNSytlePizzaStore : PizzaStore
    {
        public override Pizza CreatePizza(string type)
        {
            Pizza pizza = null;
            //         
           CNHPizzaIngredientFactory ingredientFactory = new CNHPizzaIngredientFactory();
            if (type == "cheese")
            {
                pizza = new CheesePizza(ingredientFactory);
            }
            else if (type == "viggie")
            {
                pizza = new VeggiePizza(ingredientFactory);
            }
            return pizza;
        }
    }

  
이 일련의 개 조 를 통 해 우 리 는 새로운 유형의 공장, 즉 추상 적 인 공장, 추상 적 인 공장 을 도입 하여 원 료 를 창조 했다.
추상 적 인 공장 을 이용 하여 우리 코드 는 실제 공장 에서 결합 을 해제 할 것 이다. 그러면 우리 공장 이 확장 이 필요 하 다 면 우 리 는 하위 클래스 에서 수정 하고 확장 할 수 있다.
공장 방법 과 추상 적 인 공장 의 공통점 과 장단 점
동일: 대상 을 만 드 는 데 사 용 됩 니 다.
서로 다른: 공장 방법 은 계승 을 사용 하고 추상 적 인 공장 은 조합 을 사용한다.
장점: 공장 방법 은 구체 적 인 유형 에서 결합 을 해제 하 는 것 만 책임 지고 추상 적 인 공장 은 관련 제품 을 모 으 는 데 적합 하 다.
단점: 추상 적 인 공장 확장 인 터 페 이 스 는 각 하위 클래스 를 수정 해 야 한다.

좋은 웹페이지 즐겨찾기