디자인 모델 시리즈 - 공장 방법 모델

디자인 모델 시리즈 인 의 글 을 돌 이 켜 보면 공장 모델 을 어떻게 이용 하여 전 구 를 바 꾸 는 장면 을 모 의 하 는 지 묘사 했다. 이 장면 에서 일반 전구, 에너지 절약 전구, 컬러 전 구 를 모 의 했다.그것들 은 하나의 공장 (공장 류) 에 의 해 통일 되 어 창조 된다. 우리 가 어떤 전 구 를 사용 해 야 할 지 공장 류 에 우리 에 게 똑 같은 전 구 를 만들어 달라 고 통지 하면 된다. 유 도 는 다음 과 같다.
      
      위의 유형 도 를 보면 모든 유형의 전 구 는 전구 공장 에 의 해 만들어 진다. 이때 전 구 를 만 드 는 공장 은 기업 이 확대 되 었 기 때문에 생산량 을 늘 려 야 한다. 그러면 이때 한 공장 은 대처 할 수 없 을 것 이다. 그리고 현재 한 공장 이 만 든 전구 의 종류 도 많아 서 공장 의 제조 압력 을 더욱 높 였 다. 이때기업 증축 의 가장 좋 은 방법 은 공장 을 늘 리 고 각 공장 은 하나의 전구 제조 에 만 전념 하 는 것 이다.
     1. 공장 방법 모델
     먼저 공장 방법 모델 이 무엇 인지 살 펴 보 자. 대상 을 만 드 는 데 사용 되 는 인 터 페 이 스 를 정의 하고 하위 클래스 가 어떤 종 류 를 예화 할 지 결정 하도록 한다.공장 방법 은 한 종류의 실례 화 를 하위 클래스 로 지연 시 켰 다.
     공장 방법 유형 도 는 다음 과 같다.
     
      Product: 공장 방법 이 만 든 대상 의 인 터 페 이 스 를 정의 합 니 다.위의 장면 에서 전구 가 추상 적 인 것 과 같다.
      Concrete Product: 구체 적 으로 제품 의 추상 적 인 구체 적 인 제품 류 를 실현 합 니 다.위의 장면 의 구체 적 인 전구 에 해당 한다.
      Creator: 공장 방법 을 설명 합 니 다. 이 방법 은 제품 유형의 대상 을 되 돌려 줍 니 다.
      ConcreteCreator: 공장 방법 을 다시 정의 하여 Concrete 제품 인 스 턴 스 를 되 돌려 줍 니 다.
      아마도 이것 은 모두 가 이 유형 도 를 보고 약간 모호 할 것 이다. 그러나 괜찮아. 그 다음 에 우 리 는 공장 방법 모델 을 이용 하여 우리 위의 장면 을 실현 할 것 이다. (기업 의 확 대 는 더 많은 공장 을 세 워 야 한다.)
      먼저, 기업 이 확대 되 었 기 때문에 생산량 을 늘 리 고 더 많은 공장 을 설립 해 야 한다. 생산 효율 을 향상 시 키 기 위해 모든 공장 은 하나의 종류의 전구 만 생산 하 는 데 전념 하고 공장 방법 모델 을 이용 하여 디자인 한 유형 도 는 다음 과 같다.
     
      분석 하면 서 코드 구현:
      첫 번 째 단 계 는 공장 이 확대 되 었 고 만들어 진 제품 은 전구 이기 때문에 우 리 는 전 구 를 먼저 추상 화 해 야 한다. 왜 추상 화 하려 고 하 는 지 이 글 을 참고 하 세 요.
   
   
   
   
  1. //     
  2. public interface IBulb    
  3. {    
  4.     //     
  5.     public void Luminescence();    
  6. }  

      두 번 째 단 계 는 현재 모든 종류의 구체 적 인 전구 유형 을 실현 하 는 것 이다.코드 는 다음 과 같 습 니 다:
   
   
   
   
  1. //     
  2. public class Bulb : IBulb// 、   {        
  3.       //        
  4.        public void Luminescence()        
  5.       {           
  6.              //         
  7.        }    
  8. }     
  9. //     
  10. public class FrugalBulb : IBulb // 、     
  11. {        
  12.       //         
  13.       public void Luminescence()        
  14.      {            
  15.         //         
  16.       }    
  17. }     
  18. //     
  19. public class ColorBulb : IBulb    
  20. {        
  21.       //         
  22.        public void Luminescence()        
  23.       {            
  24.             //         
  25.        }    
  26. }  

     세 번 째 단 계 는 공장 이 늘 었 기 때문에 모든 공장 은 하나의 공 통 된 행 위 를 가진다. 그것 이 바로 전 구 를 만 드 는 것 이다. 그래서 앞으로 더욱 편리 하 게 공장 을 늘 리 기 위해 우 리 는 공장 도 추상적으로 하고 코드 는 다음 과 같다.
   
   
   
   
  1. //  
  2. public interface IMyBulbFactory  
  3. {  
  4.     IBulb GetBulb();//  

     네 번 째 단 계 는 모든 종류의 전 구 를 제조 하 는 구체 적 인 공장 을 실현 하고 모든 공장 은 자신 이 만 든 종류의 전구 만 제조 하 며 코드 는 다음 과 같다.
   
   
   
   
  1. //  
  2.    public class BulbFactory : IMyBulbFactory  
  3.    {  
  4.        //    
  5.        public IBulb GetBulb()  
  6.        {  
  7.            return new Bulb();  
  8.        }  
  9.    }  
  10.  
  11.    //  
  12.    public class FrugalBulbFactroy : IMyBulbFactory  
  13.    {  
  14.        //    
  15.        public IBulb GetBulb()  
  16.        {  
  17.            return new FrugalBulb();  
  18.        }  
  19.    }  
  20.  
  21.    //  
  22.    public class ColorBulbFactroy : IMyBulbFactory  
  23.    {  
  24.        //    
  25.        public IBulb GetBulb()  
  26.        {  
  27.            return new ColorBulb();  
  28.        }  
  29.    }  

     이렇게 하면 기업 의 확대, 생산량 증가 문 제 를 만족 시 킬 수 있 습 니 다. 어떤 전구 가 필요 합 니까? 우 리 는 구체 적 인 공장 에 가서 해당 하 는 전 구 를 얻 으 면 됩 니 다. 주 함수 호출 은 다음 과 같 습 니 다.
   
   
   
   
  1.   static void Main(string[] args)  
  2.         {  
  3.             //  
  4.             IMyBulbFactory bulbFactory = new BulbFactory();  
  5.             IBulb bulb = bulbFactory.GetBulb();  
  6.             bulb.Luminescence(); //  
  7.  
  8.             //  
  9.             IMyBulbFactory frugalBulbFactroy = new FrugalBulbFactroy();  
  10.             IBulb frugalBulb = frugalBulbFactroy.GetBulb();  
  11.             frugalBulb.Luminescence(); //  
  12.  
  13.             //  
  14.             IMyBulbFactory colorbulbFacroty = new ColorBulbFactroy();  
  15.             IBulb colorBulb = colorbulbFacroty.GetBulb();  
  16.             colorBulb.Luminescence(); //  
  17. }  

          그러면 우 리 는 공장 방법 이 구체 적 인 제품 의 실례 화 를 구체 적 인 공장 유형 으로 지연 시 킬 때 클 라 이언 트 가 호출 할 때 우 리 는 어떤 구체 적 인 공장 유형 을 사용 하 는 지 보 여 줘 야 결합 도 를 높 일 수 있다 는 것 을 발견 했다.     
     2. 반 사 된 공장 방법 모드 사용
      그렇다면 위의 결합 도 를 어떻게 접촉 합 니까?C \ # 의 반사 체 제 를 통 해 현재 모든 공장 을 설정 파일 에 배치 한 다음 에 현재 사용 해 야 할 공장 노드 를 설정 할 수 있 습 니 다. 설정 파일 은 다음 과 같 습 니 다.
   
   
   
   
  1. xml version="1.0" encoding="utf-8" ?> 
  2. <configuration> 
  3.     <appSettings> 
  4.          
  5.         <add key="bulbFactory" value=" . .BulbFactory">add> 
  6.         <add key="frugalBulbFactory" value=" . .FrugalBulbFactroy">add> 
  7.         <add key="ColorBulbFactory" value=" . .ColorBulbFactroy">add> 
  8.  
  9.          
  10.         <add key="NonFactory" value="bulbFactory">add> 
  11.     appSettings> 
  12. configuration> 

     이것 은 우리 가 구체 적 인 공장 을 전문 적 으로 제공 하 는 종 류 를 포장 해 야 하기 때문에 이런 종 류 를 편리 하 게 하기 위해 서 나 는 결합 도 를 고려 하지 않 는 다.코드 는 다음 과 같 습 니 다:
   
   
   
   
  1. //   nonfactoty  
  2.     public class FactroyProvider  
  3.     {  
  4.         public static IMyBulbFactory WhereToFactroy()  
  5.         {  
  6.             string fName = string.Empty;  
  7.             string factoryName = string.Empty;  
  8.             IMyBulbFactory factory = null;  
  9.               
  10.             if(!string.IsNullOrEmpty(ConfigurationManager.AppSettings["NonFactory"]))  
  11.             {  
  12.                 factoryName = ConfigurationManager.AppSettings["NonFactory"];  
  13.                 if (!string.IsNullOrEmpty(ConfigurationManager.AppSettings[factoryName]))  
  14.                 {  
  15.                     fName = ConfigurationManager.AppSettings[factoryName];  
  16.                     factory = Assembly.Load(" ").CreateInstance(fName) as IMyBulbFactory;  
  17.                 }  
  18.             }  
  19.               
  20.             return factory;  
  21.         }  
  22.     }  

      반 사 를 통 해 공장 을 찾 을 수 있 습 니 다. 우 리 는 앞으로 회사 규 모 를 확대 하려 면 구체 적 인 공장 사례 와 제품 사례 를 늘 리 고 배치 파일 에 배치 하면 됩 니 다.
     3. 공장 방법 모델 과 공장 모델 의 차이
     여기까지 만 말씀 드 리 면 궁금 한 점 이 있 을 지 모 르 겠 습 니 다. 아무튼 처음에 저 는 이 의문 이 있 었 습 니 다. 의문 은 공장 모델 과 의 차이 가 무엇 입 니까?
     먼저, 에서 공장 류 의 코드 를 돌 이 켜 보면 코드 는 다음 과 같다.
   
   
   
   
  1. public class MyBulbFactory    
  2. {                    
  3.      public static IBulb GetBulb(string bulbName)        
  4.      {            
  5.           IBulb bulb = null;            
  6.           // ,             
  7.           switch (bulbName)            
  8.           {                
  9.                case "bulb":                    
  10.                bulb = new Bulb();                         
  11.                break;                                
  12.                case "frugalbulb":                    
  13.                bulb = new FrugalBulb();        
  14.                break;                    
  15.                case "colorbulb":    
  16.                   
  17.                 bulb = new ColorBulb();    
  18.                 break;            
  19.            }            
  20.        return bulb;        
  21.      }    
  22. }   

     이 를 통 해 알 수 있 듯 이 앞으로 우리 가 전 구 를 새로 추가 해 야 한다 면 위의 공장 류 를 수정 하고 switch 에 대응 하 는 case 분 지 를 추가 해 야 한다. 그러면 위배 된다.
개방 폐쇄 원칙, 공장 방법 은 바로 이런 제품 유형의 실례 화 를 구체 적 인 공장 류 로 지연 시 켜 실례 화 하 는 것 이다. 그러면 앞으로 신제품 이 생기 면 새로운 공장 류 와 구체 적 인 제품 만 만 만 들 면 된다. 즉, 공장 방법 모델 은 간단 한 공장 모델 을 보완 하여 개방 폐쇄 원칙 을 만족 시 켰 다.그러나 문 제 는 클 라 이언 트 가 호출 할 때마다 어떤 공장 류 를 구체 적 으로 예화 해 야 하 는 지 하 는 것 이다. 예 를 들 어:
   
   
   
   
  1. //  
  2.             IMyBulbFactory bulbFactory = new BulbFactory();//  
  3.             IBulb bulb = bulbFactory.GetBulb();  
  4.             bulb.Luminescence(); //  

 이렇게 해서 결합 성 을 증가 시 켰 다.우 리 는 위 에서 반사 류 를 사용 하여 결합 을 해 제 했 지만 또 하나의 의문 이 생 겼 다. 그러면 간단 한 공장 모델 은 제품 류 를 만 들 때 도 반 사 를 사용 하면 앞으로 제품 을 새로 만 들 때 공장 류 의 코드 를 수정 할 필요 가 없다. 즉, 간단 한 공장 모델 은 반 사 를 사용 하 는 것 처럼 개방 폐쇄 원칙 의 문 제 를 완벽 하 게 해결 할 수 있다 는 것 이다!
      그렇다면 새로운 문제 가 또 나 왔 다. 그 간단 한 공장 모델 은 또 어떤 역할 을 할 수 있 을 까?
      저 는 개인 적 으로 두 가지 이해 방식 이 있 습 니 다. 개인 적 인 관점 만 대표 하고 모두 자신의 관점 을 상세 하 게 말 하 기 를 바 랍 니 다. 한 마디 로 요약 하지 마 세 요 ~!
      첫 번 째, 초기 디자인 모델 을 응용 할 때 프로 그래 밍 언어 가 반사 체 제 를 사용 하지 않 았 을 때 공장 방법 모델 로 간단 한 공장 모델 을 업그레이드 시 켜 개방 폐쇄 원칙 을 지원 할 수 있 도록 한다.
      두 번 째, 특수 장면 에서 공장 방법 모델 은 논리 적 인 조직 을 잘 실현 할 수 있다. 예 를 들 어 본 글 에서 사용 하 는 장면 이다.

좋은 웹페이지 즐겨찾기