C \ # 디자인 모델 --- 추상 공장 모델

원문 주소: C \ # 디자인 모델 (4) - 추상 공장 모델
머리말
지난 주제 에서 공장 방법 모델 을 소개 했다. 공장 방법 모델 은 간단 한 공장 모델 의 단점 을 극복 하기 위해 디자인 된 것 이다. 간단 한 공장 모델 의 공장 류 는 제품 류 의 증가 에 따라 추가 코드 를 추가 해 야 한다). 공장 방법 모델 은 모든 구체 적 인 공장 류 는 하나의 사례 만 완성 하기 때문에 확장 성 이 좋다.그러나 현실 생활 에서 한 공장 이 하나의 제품 만 만 만 드 는 사례 가 매우 적다. 현재 의 공장 이 다 원화 되 었 기 때문에 한 공장 이 일련의 제품 을 만 들 었 다. 만약 에 우리 가 이런 시스템 을 설계 하려 고 할 때 공장 방법 모델 은 여기 서 적용 되 지 않 는 다. 그리고 추상 적 인 공장 모델 은 일련의 제품 건설 문 제 를 잘 해결 할 수 있다.이것 은 본 주제 에서 소개 하고 자 하 는 내용 이다.
2. 추상 공장 상세 소개
여기 서 먼저 생활 속 추상 적 인 공장 의 예 를 들 어 추상 적 인 공장 을 실현 한 다음 에 추상 적 인 공장 의 정의 와 UML 그림 을 제시 하여 사람들 이 추상 적 인 공장 모델 을 잘 파악 하도록 도와 준다. 또한 사람들 이 이해 할 때 추상 적 인 공장 생활 에서 사례 의 실제 와 그의 정 의 를 대조 하여 추상 적 인 공장 의 UML 그림 이 해 를 강화 할 수 있다.
2.1 추상 적 인 공장 의 구체 적 인 실현
다음은 생활 속 의 '절미' 체인점 의 예 로 추상 적 인 공장 모델 을 실현 한다.예 를 들 어 절 미 오리 목 은 강서 남창 과 상하 이에 지점 을 열 고 싶 지만 현지인 들 의 입맛 이 다 르 기 때문에 남창 에 있 는 모든 절 미 된 음식 은 매 운 것 을 만 들 고 상하 이 는 매 운 것 을 좋아 하지 않 기 때문에 상하 이의 모든 절 미 된 음식 은 남창 처럼 매 운 것 을 만 들 지 않 는 다.그러나 이런 점 이 다 르 기 때문에 남창 절미 공장 과 상하 이의 절미 공장 은 모든 절미 제품 을 생 성 하 는 것 이 다르다. 즉, 특정한 구체 적 인 공장 은 일련의 제품 (절미 모든 음식 을 가리 키 는 말) 의 건설 업 무 를 책임 져 야 한다. 다음은 추상 적 인 공장 모델 을 어떻게 사용 하여 이런 상황 을 실현 하 는 지 구체 적 으로 살 펴 보 자.
    /// <summary>
    ///                       
    ///                ,         ,          
    ///      
    /// </summary>
    class Client
    {
        static void Main(string[] args)
        {
            //               
            AbstractFactory nanChangFactory = new NanChangFactory();
            YaBo nanChangYabo = nanChangFactory.CreateYaBo();
            nanChangYabo.Print();
            YaJia nanChangYajia= nanChangFactory.CreateYaJia();
            nanChangYajia.Print();

            //               
            AbstractFactory shangHaiFactory = new ShangHaiFactory();
            shangHaiFactory.CreateYaBo().Print();
            shangHaiFactory.CreateYaJia().Print();

            Console.Read();
        }
    }

    /// <summary>
    ///      ,                   
    /// </summary>
    public abstract class AbstractFactory
    {
        //                 ,      ,                 
        public abstract YaBo CreateYaBo();
        public abstract YaJia CreateYaJia();
    }

    /// <summary>
    ///                   
    /// </summary>
    public class NanChangFactory : AbstractFactory
    {
        //       
        public override YaBo CreateYaBo()
        {
            return new NanChangYaBo();
        }
        //       
        public override YaJia CreateYaJia()
        {
            return new NanChangYaJia();
        }
    }

    /// <summary>
    ///                   
    /// </summary>
    public class ShangHaiFactory : AbstractFactory
    {
        //       
        public override YaBo CreateYaBo()
        {
            return new ShangHaiYaBo();
        }
        //       
        public override YaJia CreateYaJia()
        {
            return new ShangHaiYaJia();
        }
    }

    /// <summary>
    ///      ,           
    /// </summary>
    public abstract class YaBo
    {
        /// <summary>
        ///     ,      
        /// </summary>
        public abstract void Print();
    }

    /// <summary>
    ///      ,           
    /// </summary>
    public abstract class YaJia
    {
        /// <summary>
        ///     ,      
        /// </summary>
        public abstract void Print();
    }

    /// <summary>
    ///       ,          ,                
    /// </summary>
    public class NanChangYaBo : YaBo
    {
        public override void Print()
        {
            Console.WriteLine("     ");
        }
    }

    /// <summary>
    ///                
    /// </summary>
    public class ShangHaiYaBo : YaBo
    {
        public override void Print()
        {
            Console.WriteLine("     ");
        }
    }

    /// <summary>
    ///      
    /// </summary>
    public class NanChangYaJia : YaJia
    {
        public override void Print()
        {
            Console.WriteLine("      ");
        }
    }

    /// <summary>
    ///      
    /// </summary>
    public class ShangHaiYaJia : YaJia
    {
        public override void Print()
        {
            Console.WriteLine("      ");
        }
    }

2.2 추상 적 인 공장 모델 의 정의 와 유형
위의 코드 에 상세 한 주석 이 있 습 니 다. 여 기 는 위의 코드 를 설명 하지 않 겠 습 니 다. 다음은 추상 적 인 공장 모델 의 정 의 를 구체 적 으로 보 겠 습 니 다. (정 의 를 이해 하면 위의 실현 을 참고 하여 이 해 를 깊이 할 수 있 습 니 다)
추상 적 인 공장 모델: 제품 을 만 드 는 인 터 페 이 스 를 제공 하여 관련 되 거나 의존 하 는 대상 을 만 드 는 것 을 책임 지고 구체 적 인 유형 을 명확 하 게 지정 하지 않 습 니 다.
추상 적 인 공장 은 고객 이 추상 적 인 인 인 터 페 이 스 를 사용 하여 관련 제품 을 만 들 도록 허용 하고 실제 생산 된 구체 적 인 제품 이 무엇 인지 알 거나 관심 을 가 질 필요 가 없다.이렇게 하면 고객 은 구체 적 인 제품 에서 결합 을 해제 할 수 있다.다음은 추상 적 인 작업 모델 의 유형 도 를 통 해 각 유형 간 의 관 계 를 파악 한다.
2.3 추상 적 인 공장 의 수요 변경
위의 추상 적 인 공장 의 실현 을 본 후에 '절미' 회사 가 호 남 에 지점 을 하나 열 려 면 어떻게 합 니까?호 남 사람들 은 매 운 것 을 좋아 하기 때문에 추상 적 인 공장 모델 을 응용 한 시스템 이 이런 수요 에 어떻게 대응 하 는 지 구체 적 으로 살 펴 보 자.
    /// <summary>
    ///                ,         
    ///                    
    /// </summary>
    public class HuNanFactory : AbstractFactory
    {
        //       
        public override YaBo CreateYaBo()
        {
            return new HuNanYaBo();
        }

        //       
        public override YaJia CreateYaJia()
        {
            return new HuNanYajia();
        }
    }

    /// <summary>
    ///      
    /// </summary>
    public class HuNanYaBo : YaBo
    {
        public override void Print()
        {
            Console.WriteLine("     ");
        }
    }

    /// <summary>
    ///      
    /// </summary>
    public class HuNanYajia : YaJia
    {
        public override void Print()
        {
            Console.WriteLine("      ");
        }
    }

이때 세 가지 유형 만 추가 해 야 한다. 하 나 는 호 남 의 구체 적 인 공장 류 로 호 남 의 맛 을 가 진 오리 목 과 오리 프레임 을 만 드 는 것 을 책임 지고 다른 두 가 지 는 호 남 의 맛 을 가 진 오리 목 류 와 오리 프레임 류 이다.상기 코드 를 통 해 알 수 있 듯 이 추상 적 인 공장 은 시리즈 제품 의 변화 에 대해 '개방 - 폐쇄' 원칙 (시스템 이 확장 개방, 수정 폐쇄 를 요구 하 는 것 을 말한다) 을 지원 하고 확장 이 매우 간편 하지만 추상 적 인 공장 은 신제품 을 추가 하 는 상황 에 대해 '개방 - 폐쇄' 를 지원 하지 않 는 다."원칙, 이것 도 추상 적 인 공장 의 단점 인 데 그 점 은 네 번 째 부분 에서 자세히 소개 하 겠 습 니 다.
3. 추상 공장 의 분석
추상 적 인 공장 모델 은 구체 적 인 제품 의 설립 을 구체 적 인 공장 의 서브 클래스 로 지연 시킨다. 이렇게 하면 대상 의 설립 을 밀봉 하면 클 라 이언 트 와 구체 적 인 제품 류 간 의 의존 을 줄 이 고 시스템 의 결합 도 를 낮 출 수 있다. 그러면 후기의 유지 와 확장 에 유리 하 다. 이것 은 추상 적 인 공장 모델 의 장점 이다. 그리고 추상 적 인 모델 은 부족 한 점도 존재 한다.추상 적 인 공장 의 단점 을 구체 적 으로 살 펴 보 자.
추상 적 인 공장 모델 은 새로운 종류의 제품 변 화 를 지원 하기 어렵다. 추상 적 인 공장 인터페이스 에서 만 들 수 있 는 제품 집합 이 확정 되 었 기 때문이다. 신제품 을 추가 해 야 한다 면 추상 적 인 공장 의 인 터 페 이 스 를 수정 해 야 한다. 그러면 추상 적 인 공장 류 와 모든 하위 류 의 변화 와 관련 되 고 '개발 - 폐쇄' 원칙 에 위배 된다.
추상 적 인 공장 의 장단 점 을 알 게 된 후에 어떤 상황 에서 추상 적 인 공장 모델 을 사용 하 는 지 잘 파악 할 수 있다. 다음은 추상 적 인 공장 모델 을 사용 하 는 시스템 이 그 몇 가지 전제 에 부합 되 어야 하 는 지 구체 적 으로 살 펴 보 자.
하나의 시스템 은 제품 류 인 스 턴 스 가 어떻게 생 성 되 고 조합 되 며 표현 되 는 지 에 의존 하 는 것 을 요구 하지 않 는 다. 이것 도 모든 공장 모델 응용의 전제 이다. 이 시스템 은 여러 개의 시리즈 제품 이 있 는데 시스템 에서 그 중의 한 시리즈 제품 만 소비 한다 .
시스템 은 하나의 제품 류 의 라 이브 러 리 를 제공 해 야 한다. 모든 제품 이 같은 인터페이스 로 나타 나 고 클 라 이언 트 는 구체 적 인 실현 에 의존 할 필요 가 없다. 4.. NET 에서 추상 적 인 공장 모델 실현
추상 적 인 공장 모델 은 실제 에서 의 응용 도 상당히 빈번 하 다. 그러나 우리. NET 라 이브 러 리 에 도 추상 적 인 공장 모델 을 응용 하 는 유형 이 존재 한다. 이런 유형 은 바로 System. Data. Common. DbProvider Factory 이다. 이런 유형 은 System. Data. dll 프로그램 에 집중 되 고 추상 적 인 공장 모델 에서 추상 적 인 공장 역할 을 한다. 우 리 는 reflector 반 컴 파일 도구 로 이러한 실현 을 볼 수 있다.:
///          
///                 ,
///           DbConnection  (        ,       YaBo )、DbCommand 、DbDataAdapter ,                     ,
public abstract class DbProviderFactory
{
    //               
    protected DbProviderFactory();
    public virtual DbCommand CreateCommand();
    public virtual DbCommandBuilder CreateCommandBuilder();
    public virtual DbConnection CreateConnection();
    public virtual DbConnectionStringBuilder CreateConnectionStringBuilder();
    public virtual DbDataAdapter CreateDataAdapter();
    public virtual DbDataSourceEnumerator CreateDataSourceEnumerator();
    public virtual DbParameter CreateParameter();
    public virtual CodeAccessPermission CreatePermission(PermissionState state);
}

DbProviderFactory
클래스 는 추상 적 인 공장 류 로 데이터베이스 연결 을 만 들 때 필요 한 대상 집합 인 터 페 이 스 를 제공 합 니 다. 실제 생 성 된 작업 은 하위 공장 에서 진행 되 고 마이크로소프트 는 SQL Server 데이터 베 이 스 를 사용 하기 때문에 SQL Server 데 이 터 를 연결 하 는 구체 적 인 공장 을 제공 합 니 다. 구체 적 인 코드 는 컴 파일 도구 로 볼 수 있 습 니 다. 구체 적 인 코드 는 다음 과 같 습 니 다.
///           ,      SQL Server        
public sealed class SqlClientFactory : DbProviderFactory, IServiceProvider
{
    // Fields
    public static readonly SqlClientFactory Instance = new SqlClientFactory();

   //     
    private SqlClientFactory()
    {
    }
    
   //           
    public override DbCommand CreateCommand()
    {  //       
        return new SqlCommand();
    }

    public override DbCommandBuilder CreateCommandBuilder()
    {
        return new SqlCommandBuilder();
    }

    public override DbConnection CreateConnection()
    {
        return new SqlConnection();
    }

    public override DbConnectionStringBuilder CreateConnectionStringBuilder()
    {
        return new SqlConnectionStringBuilder();
    }

    public override DbDataAdapter CreateDataAdapter()
    {
        return new SqlDataAdapter();
    }

    public override DbDataSourceEnumerator CreateDataSourceEnumerator()
    {
        return SqlDataSourceEnumerator.Instance;
    }

    public override DbParameter CreateParameter()
    {
        return new SqlParameter();
    }

    public override CodeAccessPermission CreatePermission(PermissionState state)
    {
        return new SqlClientPermission(state);
    }
}

마이크로소프트 는 SQL Server 를 연결 하 는 구체 적 인 공장 의 실현 만 제 시 했 기 때문에 Oracle, MySql 을 연결 하 는 구체 적 인 공장 의 실현 도 사용자 정의 할 수 있 습 니 다.
총화
여기까지 추상 적 인 공장 모델 에 대한 소 개 는 끝나 고 다음 주제 에 건축 모델 을 소개 할 것 이다.
프로그램 원본: 클릭 하여 링크 열기

좋은 웹페이지 즐겨찾기