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;
}
}
이 일련의 개 조 를 통 해 우 리 는 새로운 유형의 공장, 즉 추상 적 인 공장, 추상 적 인 공장 을 도입 하여 원 료 를 창조 했다.
추상 적 인 공장 을 이용 하여 우리 코드 는 실제 공장 에서 결합 을 해제 할 것 이다. 그러면 우리 공장 이 확장 이 필요 하 다 면 우 리 는 하위 클래스 에서 수정 하고 확장 할 수 있다.
공장 방법 과 추상 적 인 공장 의 공통점 과 장단 점
동일: 대상 을 만 드 는 데 사 용 됩 니 다.
서로 다른: 공장 방법 은 계승 을 사용 하고 추상 적 인 공장 은 조합 을 사용한다.
장점: 공장 방법 은 구체 적 인 유형 에서 결합 을 해제 하 는 것 만 책임 지고 추상 적 인 공장 은 관련 제품 을 모 으 는 데 적합 하 다.
단점: 추상 적 인 공장 확장 인 터 페 이 스 는 각 하위 클래스 를 수정 해 야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.