출하 방법(Factory method)

3011 단어
1. 본질:'공장'개념을 실현한 대상을 대상으로 하는 디자인 모델로 대상의 구체적인 유형을 지정하지 않은 상황에서 대상을 만드는 문제를 처리한다.공장 방법 모델의 실질은 창설 대상의 인터페이스를 정의하지만 이 인터페이스를 실현하는 클래스로 실례화된 클래스를 결정하는 것이다.공장 방법은 클래스의 실례화를 하위 클래스로 미루어 진행한다.
둘째, 해결해야 할 문제: 대상의 창설 시기이고 확장 전략을 제공하여 개방 폐쇄 원칙에 잘 부합된다.공장 방법도 Virtual Constructor라고 합니다.Static Factory Method(Static Factory Method) 모드라고도 하며 클래스 생성 모드에 속합니다.단순 공장 모델에서 매개 변수에 따라 서로 다른 종류의 실례를 되돌릴 수 있다.단순 공장 모델은 하나의 클래스를 정의하여 다른 클래스의 실례를 생성하는데, 생성된 실례는 일반적으로 공통된 부류를 가지고 있다.
3. 안전성: 공장 방법의 창설 대상은 직접 새로운 대상을 창설하는 것에 비해 공장 방법 모델은 고객 프로그램으로 하여금 공장 방법의 창설 대상에게 공통된 행위를 요구할 수 있게 한다.따라서 클래스 차원 구조에 새로운 구체적인 제품을 도입할 때 클라이언트 코드를 수정할 필요가 없다. 왜냐하면 되돌아오는 모든 구체적인 대상의 인터페이스는 클라이언트가 사용하던 이전의 인터페이스와 같기 때문이다.
4. 장점: 1: 대상의 창설과 대상 자체의 업무 처리를 분리하면 시스템의 결합도를 낮출 수 있고 둘 다 수정하기 쉽다.2: 공장 클래스의 공장 방법을 호출할 때 공장 방법은 정적 방법이기 때문에 사용하기 편리하고 클래스 이름을 통해 직접 호출할 수 있으며 간단한 매개 변수만 전송하면 된다. 실제 개발에서는 호출할 때 전송된 매개 변수를 XML 등 형식의 설정 파일에 저장할 수 있고 매개 변수를 수정할 때 원본 코드를 수정할 필요가 없다.3. 단순 공장 모델의 가장 큰 문제는 공장류의 직책이 상대적으로 과중하고 새로운 제품을 늘리려면 공장류의 판단 논리를 수정해야 한다는 점이다. 이 점은 개폐원칙과 어긋난다.4: 단순 공장 모델의 요점은 다음과 같다. 당신이 무엇을 필요로 하는지, 정확한 매개 변수를 보내기만 하면 당신이 필요로 하는 대상을 얻을 수 있고 세부 사항을 알 필요가 없다.
5. 장면 사용
1: 컴파일할 때 만들 대상의 클래스를 정확하게 예상할 수 없습니다.2: 클래스는 하위 클래스가 실행할 때 무엇을 만들지 결정하도록 합니다.3: 클래스는 약간의 보조 클래스가 그 하위 클래스인데 어떤 하위 클래스라는 정보를 부분적으로 되돌려 주고 싶습니까?
공장 방법이 코코아 터치에서의 응용
공장 방법은 코코아 터치에서 거의 어디서나 볼 수 있으며'클래스 묶음'이라고도 부른다.Objective-C에서 흔히 볼 수 있는 2단계 대상 창설법 [[[SomeClass alloc] init].하지만 편리한 창설 방법도 있다.예를 들어 NSNumber에는 numberWith* 방법이 많습니다.이 중 두 개는numberWithBool:과numberWithChar:입니다.그것들은 클래스 방법이다. 즉, 우리는 NSNumber에게 [[[NSNumber number WithBool:bool]]과 [NSNumber number WithChar:char]]를 보내서 전송된 매개 변수와 같은 유형의 각종 NSNumber 실례를 얻는다.NSNumber의 구체적인 하위 유형을 만드는 방법과 관련된 모든 세부 사항은 NSNumber의 클래스 공장 방법이 책임진다.[[NSNumber numberWithBool:bool]]의 경우 방법은 값을 bool로 받아들이고 NSNumber의 내부 하위 클래스의 실례를 초기화하여 전송된 값을 반응시킬 수 있도록 한다.
장점
1: 호출자가 대상을 만들고 싶으면 그 이름만 알면 된다.2: 확장성이 높습니다. 제품을 추가하려면 공장 종류만 확장하면 됩니다.3: 제품의 구체적인 실현을 차단하고 호출자는 제품의 인터페이스에만 관심을 가진다.
결점
매번 하나의 제품을 늘릴 때마다 구체적인 클래스와 대상을 늘려 공장을 실현해야 하기 때문에 시스템 중의 클래스의 개수를 배로 증가시키고 어느 정도에 시스템의 복잡도를 증가하는 동시에 시스템의 구체적인 클래스에 대한 의존도를 증가시켰다.이것은 결코 무슨 좋은 일이 아니다.
다음 코드는 Drinking의 공장 방법을 통해 콜라와 맥주 두 가지 사유류를 분류했다.
class Drinking {
    typealias LiquidColor = UIColor
    var color: LiquidColor {
        return .clear
    }

    class func drinking(name: String) -> Drinking {
        var drinking: Drinking
        switch name {
        case "Coke":
            drinking = Coke()
        case "Beer":
            drinking = Beer()
        default:
            drinking = Drinking()
        }

        return drinking
    }
}

class Coke: Drinking {
    override var color: LiquidColor {
        return .black
    }
}

class Beer: Drinking {
    override var color: LiquidColor {
        return .yellow
    }
}

let coke = Drinking.drinking(name: "Coke")
coke.color // Black

let beer = Drinking.drinking(name: "Beer")
beer.color // Yellow”

좋은 웹페이지 즐겨찾기