디자인 모델 의 추상 적 인 공장

7396 단어 디자인 모드
공장 방법 모드: 대상 을 만 드 는 데 사용 할 인 터 페 이 스 를 정의 하여 하위 클래스 가 어떤 종 류 를 예화 할 지 결정 합 니 다.
단순 공장 VS 추상 공장: 이 두 모델 의 차이 에 대해 생각해 봤 어 요.간단 한 공장 은 간단 하기 때문에 하나의 종 류 를 만 드 는 과정 을 패키지 (이런 종 류 는 일반적으로 하나의 공공 기본 클래스 가 있 음) 하고 Switch 나 다른 판단 형식 으로 필요 한 종 류 를 만 들 었 기 때 문 입 니 다 (물론 반사 도 사용 할 수 있 습 니 다).추상 적 인 공장 이 만 든 클래스 는 더욱 복잡 하 다. 일반적으로 만 든 클래스 (하위 클래스) 는 같은 기본 클래스 가 있 고 서로 다른 상황 에서 대응 하 는 하위 클래스 를 선택한다.
상황 재현:
추상 적 인 공장 이 라 고 하면 서로 다른 데이터 베이스 에 대해 유형 대상 을 어떻게 신속하게 전환 하 는 지 생각해 야 한다. 즉, 자신 이 생각 하 는 대상 을 간단하게 만 들 수 있 고 쓸데없는 말 을 많이 하지 않 는 다.
실체 클래스 인터페이스:
    interface IUser

    {

         void Add(IUser user);

         List<IUser> GetUsers();

    }

모든 User 형식의 인터페이스 (SqlServer 든 Oracle 이 든 Access 든) 로 IUser 형식의 인터페이스 입 니 다.
구현 클래스:
SqlServer:
    class SqlServerUser:IUser

    {

        public void Add(IUser user)

        {

           

        }



        public List<IUser> GetUsers()

        {

            return new List<IUser>();

        }

    }

Oracle:
    class OracleUser:IUser

    {

        public void Add(IUser user)

        {



        }



        public List<IUser> GetUsers()

        {

            return new List<IUser>();

        }

    }

모델 의 정의 에 따라 공장 의 인터페이스 와 공장 의 하위 클래스 가 있 습 니 다. 다음 과 같 습 니 다.
공장 인터페이스:
    interface IDataFactory

    {

        IUser CreateUser();

    }

SqlServer 공장:
    class SqlServerDataFactory:IDataFactory

    {

        public IUser CreateUser()

        {

            return new SqlServerUser();

        }

    }

Oracle 공장:
    class OracleDataFactory:IDataFactory

    {

        public IUser CreateUser()

        {

            return new  OracleUser();

        }

    }

코드 의 과정 은 비교적 간단 합 니 다. 실체 류 인 터 페 이 스 를 만 들 고 인터페이스의 실현 류 를 만 듭 니 다 (구체 적 인 실현 류 는 자신의 수요 에 따라 몇 가지 가 있 습 니 다).공장 의 인 터 페 이 스 를 만 들 고 공장 을 만 드 는 실현 류 (구체 적 인 실현 류 는 자신의 수요 에 따라 몇 가지 가 있 음) 를 실현 류 에서 공장 의 방법 을 보완 한다 (해당 하 는 실체 유형 을 만 드 는 것).
사 용 했 습 니 다:
            IDataFactory sqlDataFactory = new SqlServerDataFactory();

            IDataFactory oracleDataFactory = new OracleDataFactory();

            IUser sqlUser = sqlDataFactory.CreateUser();

            IUser oracleUser = oracleDataFactory.CreateUser();

해당 하 는 공장 클래스 (SqlServer 또는 Oracle) 를 만 들 고 공장 클래스 로 해당 하 는 실체 (SqlServer 또는 Oracle) 를 만 듭 니 다.
물론, 우리 의 데이터 베 이 스 는 한 장의 User 표 뿐만 아니 라 Role 표 나 RoleAndUser 등 여러 장의 표 도 있 을 것 입 니 다. 그러면 우 리 는 대응 하 는 인터페이스 와 인터페이스의 대응 실현 류 를 만 들 고 공장 의 인터페이스 (대응 하 는 건설 실체 방법 추가) 도 수정 해 야 합 니 다. 그리고 공장 인터페이스의 실현 류 도 잊 지 마 세 요.복잡 해, 복잡 해.
최종 무기:
방금 분 석 했 습 니 다. 만약 에 한 가지 유형 을 추가 하거나 삭제 하면 네 가지 부분 을 수정 해 야 하기 때문에 우 리 는 비장의 카드 를 꺼 내 서 '반사' 를 해 야 합 니 다.
첫 번 째 단 계 는 먼저 감원 을 해서 공장 을 지 워 라.
두 번 째 단 계 는 조작 공장 을 추가 하 는 것 이다.
세 번 째 단 계 는 두 개의 변 수 를 추가 합 니 다. 하 나 는 실체 류 를 대표 하 는 프로그램 집합 입 니 다. 하 나 는 현재 어떤 종류의 실 체 를 만 드 는 지 대표 합 니 다 (SqlServer 또는 Oracle).
다음 과 같다.
    class DataFactory

    {

        private static readonly string AssemblyName = "   (        )";

        private static readonly string db = "SqlServer";

        public static IUser CreateUser()

        {

            string typeName = AssemblyName + "." + db + "." + db + "User";

            return (IUser)Assembly.Load(AssemblyName).CreateInstance(typeName);

        }

    }

사실 Assembly Name 에 네 임 스페이스 가 포함 되 어 있 는 지 여 부 는 스스로 결정 할 수 있 습 니 다. 현재 실제 포함 되 어 있 지 않 습 니 다. 물론 포함 되 어 있 으 면 Assembly. Load 를 사용 할 수 없습니다.
코드 가 수 정 된 후에 만약 에 우리 가 다른 실체 류 를 추가 하려 면 하나의 인터페이스 와 일치 하 는 실현 류 만 추가 하면 된다.세심 한 당신 은 Oracle 을 만 들 려 면 매우 번 거 로 울 것 입 니 다. db 의 값 을 수정 해 야 하기 때문에 이 점 은 설정 방식 을 통 해 이 루어 질 수 있 습 니 다. 설정 파일 을 동적 으로 읽 으 면 됩 니 다. 그러나 이것 은 조금 좋 지 않 습 니 다. 프로그램의 실행 중 에 우 리 는 수시로 임의의 유형 에 접근 할 수 있 기 때 문 입 니 다.그래서 이 점 에서 우리 의 첫 번 째 방식 은 이런 문제 가 없다.여기 서 저 는 여러분 이 적당 한 수정 을 통 해 만 드 는 방법 을 추천 합 니 다. 인 자 를 추가 하여 어떤 유형 을 만 들 지 결정 할 수 있 습 니 다. 물론 상수 나 개인 적 인 전체 변수, 심지어 매 거 진 것 도 ok 입 니 다. 관건 은 여러분 개인의 취향 에 달 려 있 습 니 다.
자, 이번 추상 공장 은 이렇게 많은 것 을 말 합 니 다. 여러분 들 이 의견 과 건 의 를 많이 해 주시 기 바 랍 니 다. 코드 는 여기 있 습 니 다 다운로드 하 다..

좋은 웹페이지 즐겨찾기