한 편 이면 충분 합 니 다. 디자인 모델 (1) - 공장 모델.

7820 단어
공장 모델 은 창설 모델 에 속한다. 일반적인 상황 에서 사용 장면 과 실현 방식 에 따라 4 가지 로 나 뉜 다. 간단 한 공장 모델 Simple Factory Pattern, 정적 공장 모델 Static Factory Pattern, 공장 방법 모델 Factory Method Pattern, 추상 적 인 공장 모델 Abstract Factory Pattern 이다.
디자인 모델 을 배 울 때 억지로 유형 도 를 옮 기지 말고 이런 모델 의 사상 을 배우 고 이런 문 제 를 어떻게 해결 하 는 지 주목 하 는 것 이 좋 습 니 다. 그래서 뒤의 것 은 모두 이 두 가지 목적 으로 자신의 소감 을 공유 하 는 것 입 니 다.
아래 의 예 가 적절 하지 않 으 니 공장 모델 을 이해 할 수 있 으 면 된다.친 구 는 청 두에 찻집 을 열 어 찻잎 관리 시스템 을 만 들 려 고 한다.지금 은 수 요 를 간단하게 분석 하고 이 시스템 에 간단 한 주문 기능 을 추가 하면 고객 이 차 를 살 때 클 라 이언 트 를 통 해 주문 할 수 있다.
먼저 간단 한 버 전 을 만 들 고 TeaStore 을 통 해 서로 다른 유형의 차 에 따라 주문 합 니 다.
fun main(args: Array)
{
    val redStore:TeaStore = TeaStore()
    redStore.order(TeaStore.TeaType.RED).getTea() 
    redStore.order(TeaStore.TeaType.GREEN).getTea()
}

새로 만 든 TeaStore 그리고 손님 은 홍차 한 잔, 녹차 한 잔 을 주문 했다.아래 코드 에서 볼 수 있 듯 이 현재 시스템 은 홍차 와 녹차 밖 에 없다.
class TeaStore
{
   enum class TeaType 
   {
        RED,
        GREEN,
        BLACK,
        YELLOW,
    }
    /**
     *   
     */
    fun order(type: TeaType): Tea
    {
       val tea = when (type)
        {
            TeaType.RED   -> RedTea()
            TeaType.GREEN -> GreenTea()
        } 
        tea.addWater()
        tea.cook() 
        return tea
    }
}

현재 고객 이 가게 에서 황 차 를 마 실 수 있 기 를 원 하기 때문에 시스템 은 황 차 유형 을 지원 해 야 한다. 이때 우 리 는 이렇게 수정 할 수 있다 TeaStroe.
 /**
  *   
  */
 fun order(type: TeaType): Tea
 {
   val tea = when (type)
    {
        TeaType.RED   -> RedTea()
        TeaType.GREEN -> GreenTea()
        TeaType.YELLOW -> YellowTea() //     
    } 
    tea.addWater()
    tea.cook() 
    return tea
}

이제 주문 할 때 황차 타 입 을 추가 할 수 있 습 니 다.문 제 는 차 를 추가 할 때마다 switch 안의 조건 을 수정 해 야 한 다 는 점 이다. 분명히 개폐 원칙 에 부합 되 지 않 는 다.
단순 공장 모드
아 날로 그 는 목적 이 아니 라 이해 에 만 도움 을 줍 니 다. [이미지 업로드 실패... (image - e21af9 - 1527174175649)]
간단 한 공장 은 매번 직접 소비 류 의 코드 를 수정 하 는 것 을 해결 할 수 있다.다음은 간단 한 공장 모델 로 하나의 버 전 을 실현 하고 공장 으로 Tea 류 의 사례 를 생산 한다.
class SimpleFactory
{
    /**
     *    
     */
    fun createTea(type: TeaStore.TeaType): Tea
    {
        return when (type)
        {
            TeaStore.TeaType.RED   -> RedTea()
            TeaStore.TeaType.GREEN -> GreenTea()
            else                   -> NoneTea()
        }
    }
}

그리고 다음 코드 를 수정 하여 공장 생 성 클래스 를 사용 합 니 다.
/**
 *   
 */
fun order(type: TeaType): Tea
{
    val tea = SimpleFactory.createTea(type)
    tea.addWater()
    tea.cook() 
    return tea
}

현재 swith 대신 간단 한 공장 Tea 류 를 만 들 고 있 습 니 다.어, 잠깐 만, 지금 내 가 차 를 하나 첨가 하려 고 할 때 어 떡 하지?공장 류 SimpleFactory 를 열 고 swith 지점 을 계속 추가 합 니 다.이상 할 거 야. 이 건 예전 과 똑 같 잖 아. 다른 곳 에서 수정 한 거 야. 여기 TeaStroe 만 생산 소비 Tea 와 같은 사례 가 있어. 만약 에 100 곳 이 있다 면?
디자인 모델 이 하고 있 는 일 은 딱 하나 입 니 다. 포장 변화, 항상 변화 하 는 코드 를 블랙박스 에 밀봉 하여 전체적으로 변 하지 않 게 합 니 다.
간단 한 공장 모델 이 해결 하 는 문 제 는 바로 포장 창설 류 의 변화 이다. Tea 유형의 수정 을 공장 류 에서 통제 하고 공장 류 를 사용 하여 발생 하 는 Tea 사례 를 사용 하 는 곳 은 더 이상 수정 할 필요 가 없다.
마지막 으로 간단 한 공장 모델 과 정태 적 인 공장 모델 의 차 이 를 설명 한다. 만약 에 createTea() 을 정태 적 인 방법 으로 실현 하면 정태 적 인 공장 모델 이 고 유형 화 된 방법 을 실현 하면 간단 한 공장 모델 이다.
우리 시스템 을 사용 하여 찻집 의 효율 이 향상 되 어 많은 돈 을 벌 었 습 니 다. 지금 은 소프트웨어 원 에 지점 을 열 었 습 니 다. 서로 다른 사람들 이 가게 마다 다른 차 를 파 는 것 에 적응 하기 위해 소프트웨어 원 에서 차 를 팔 고 다른 도 핑 제 를 추 가 했 습 니 다. 코드 홍차 (코드 를 쓰 고 bug 가 없 음) 와 코드 녹 차 를 마 셨 습 니 다. 예전 의 가 게 는 동쪽 에서 직접 동 점 이 라 고 부 르 고 일반 홍차 와 일반 녹 차 를 팔 았 습 니 다.이전의 방식 은 차 에 대한 수정 만 만족 시 킬 수 있 을 뿐 찻집 의 확장 에 만족 하지 못 했다.
공장 방법 모델
공장 방법 모드 (영어: Factory methodpattern) 는 다른 생 성 모드 와 마찬가지 로 대상 의 구체 적 인 유형 을 지정 하지 않 은 상태 에서 대상 을 만 드 는 문 제 를 처리 합 니 다.공장 방법 모델 의 실질 은 "창설 대상 의 인 터 페 이 스 를 정의 하지만, 이 인 터 페 이 스 를 실현 하 는 클래스 로 하여 금 어떤 클래스 를 실례 화 할 것 인 지 를 결정 하 게 하 는 것 이다. 공장 방법 은 클래스 의 실례 화 를 하위 클래스 로 미 루 게 한다."
아 날로 그 는 목적 이 아니 라 이해 에 만 도움 이 된다.
[사진 업로드 실패... (image - 485 df - 1527174175650)] 아 날로 그 에서 보 듯 이 우 리 는 차 를 만 드 는 방법 을 찻집 에 두 었 고 추상 적 인 찻집 TeaStore 이 있 으 며 Tea 인 스 턴 스 를 만 드 는 방법 을 TeaStroe 의 하위 클래스 에 두 었 다.
abstract class TeaStore
{
    enum class TeaType
    {
        RED,
        GREEN,
        BLACK,
        YELLOW,
    }
    /**
     *   
     */
    fun order(type: TeaType): Tea
    {
        val tea: Tea = createTea(type)
        print("
--------------------") tea.addWater() tea.cook() return tea } // abstract protected fun createTea(type: TeaType): Tea }

추상 적 인 찻집 을 바탕 으로 두 지역 의 찻집 을 실현 한다.
class SoftTeaStore : TeaStore()
{
    override fun createTea(type: TeaType): Tea
    {
        return when (type)
        {
            TeaType.RED   -> CodeRedTea()
            TeaType.GREEN -> CodeGreenTea()
            else          -> NoneTea()
        }
    }
}
class EastTeaStore : TeaStore()
{
    override fun createTea(type: TeaType): Tea
    {
        return when (type)
        {
            TeaType.RED   -> RedTea()
            TeaType.BLACK -> BlackTea()
            TeaType.GREEN -> GreenTea()
            else          -> NoneTea()
        }
    }
}

소프트웨어 원 의 찻집 에서 산 홍 차 는 코드 홍차 이 고 녹 차 는 코드 녹차 이 며 동 점 에서 파 는 것 은 보통 차 입 니 다.지금 이 두 가게 로 각각 차 한 잔 을 주문 합 니 다.
fun main(args: Array)
{
    val redStore:TeaStore = EastTeaStore()
    //           
    redStore.order(TeaStore.TeaType.RED).getTea()

    val greenStore: TeaStore = SoftTeaStore()
    //          
    greenStore.order(TeaStore.TeaType.GREEN).getTea()
}

소프트웨어 원 의 홍 차 는 고객 이 도 핑 제 를 첨가 한 홍 차 를 받 았 고, 동점 에서 받 은 홍 차 는 일반 녹차 다.지금 차 를 추가 하면 소프트웨어 원 이 든 동점 이 든 예전 과 마찬가지 로 공장 방법 만 수정 해 야 한다. 예전 과 달리 지금 은 지역 에 따라 다른 차 를 확장 할 수 있 을 뿐만 아니 라 새로운 가게 도 추가 할 수 있다. 예 를 들 어 북 점, 검 은 가게 등 이다. 우리 의 고객 측 Main 은 tea 를 소비 하 는 곳 이다. 수정 하지 않 아 도 된다.
추상 공장 모드
추상 적 인 공장 모델 (영어: Abstract factory pattern), 추상 적 인 공장 모델 은 하나의 방식 을 제공 하여 같은 주 제 를 가 진 단독 공장 을 포장 할 수 있다.
아 날로 그 는 목적 이 아니 라 이해 에 만 도움 이 된다.그래서 지금 차 를 우려 내 는 물 등 은 지역 별로 따로 제공 해 야 합 니 다. 그러면 우리 공장 은 일련의 재 료 를 생산 해 야 합 니 다. 공장 방법 모델 과 마찬가지 로 물 을 만 드 는 공장 방법 이 많아 졌 을 뿐 입 니 다.
class SoftTeaStore : TeaStore()
{
    //    
    override fun createTea(type: TeaType): Tea
    {
        return when (type)
        {
            TeaType.RED   -> CodeRedTea()
            TeaType.GREEN -> CodeGreenTea()
            else          -> NoneTea()
        }
    }
    //       
    override fun createWater(type: WaterType) : Water
    {
        return when (type)
        {
            WaterType.WHITE   -> WhiteWater()
            WaterType.NORMAL -> NormalWater()
            else          -> NoneWater()
        }
    }
}

이렇게 되면 일련의 공 예 를 한 공장 에 제한 하면 동 점 에서 생수 를 사용 하 는 상황 이 나타 나 지 않 고 절차 와 생산 업 체 의 시험 도 규범화 시 킬 수 있다.같은 차 나 찻집 이 새로 생 겨 수요 에 따라 다양한 찻집 을 쉽게 만 들 수 있다.
총결산
요약 하면 가끔 은 클래스 의 생 성과 초기 화가 비교적 무 겁 기 때문에 사용 하 는 곳 마다 실례 화 를 하면 중복 코드 가 많이 발생 하고 공장 모델 은 클래스 를 통일 적 으로 만 들 고 초기 화 할 수 있 습 니 다.공장 모델 은 4 가지 로 나 뉜 다. 간단 한 공장 모델, 정태 공장 모델, 공장 방법 모델, 추상 적 인 공장 모델 이다.그 중에서 간단 한 공장 모델, 정태 적 인 공장 모델 의 차 이 는 창설 방법 을 어떤 방식 으로 실현 하 는 지 에 있다. 공장 방법 모델 은 창설 을 하위 클래스 로 지연 시 켜 진행 하 는 것 이 고 추상 적 인 공장 모델 은 일련의 공장 방법의 조합 이다.그들 은 서로 다른 문 제 를 해결 했다. 간단 한 공장 과 정태 적 인 공장 은 주로 유형 이 일치 하지 않 고 코드 를 반복 하 는 것 을 해결 했다. 공장 방법 은 주로 서로 다른 유형 에 대해 서로 다른 사례 를 만 들 수 있 고 추상 적 인 공장 이 주로 해결 하 는 문 제 는 일련의 공장 측 법 에 대한 포장, 절차 상의 규범 적 인 확장 이다.
더 보기
높 은 산 에 오 르 지 않 으 면 하늘 이 높 은 줄 모른다.깊 은 시내 에 임 하지 않 고 땅 이 두 꺼 운 줄 도 모 르 고 조언, 교류, 사랑 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기