iOS 설계 모드 - 공장 모드

5262 단어
무엇이 공장 방법 모델입니까?
공장 방법도 허구조기라고도 하는데 이런 상황에 적용된다. 하나의 클래스는 어떤 종류의 대상을 생성해야 할지 예측할 수 없고 그 하위 클래스로 하여금 생성된 대상을 지정하게 한다.
공장 방법 모델: 창설 대상의 인터페이스를 정의하여 하위 클래스가 실례화된 클래스를 결정하도록 합니다.공장 방법은 한 종류의 실례화를 하위 종류로 늦추었다.
출하 방법 사용 시기
@: 컴파일할 때 만들 대상의 클래스를 정확하게 예상할 수 없습니다.
@: 클래스는 하위 클래스가 실행할 때 무엇을 만들지 결정하도록 합니다.
@: 클래스에는 하위 클래스가 있습니다. 하위 클래스로 돌아가는 정보를 국부화하고 싶습니다.
이 모델을 사용하는 최소한의 방법은 공장 방법이 어떤 대상을 변경하여 되돌려줄 수 있는지에 대해 더 많은 유연성을 줄 수 있다는 것이다.
플랜트 방법을 사용하여 객체를 작성하는 것은 새 특정 객체를 직접 작성하는 것보다 Best Practice로 간주됩니다.공장 방법 모델은 고객 프로그램이 공장 방법으로 만든 대상에게 공통된 행위를 요구할 수 있게 한다.그래서 클래스 차원 구조에 새로운 구체적인 제품을 도입할 때 클라이언트 코드를 수정할 필요가 없다.되돌아오는 모든 구체적인 대상의 인터페이스는 클라이언트가 계속 사용하고 있는 인터페이스와 같기 때문이다.
Cocoa Touch 프레임워크에 공장 접근 방법 적용
예를 들어 NSNumber에는 많은 numberWith* 방법이 있다.이 중 두 개는numberWithBool:과numberWithChar:입니다.그것들은 클래스 방법이다. 즉, 우리는 NSNumber에게 [NSNumber number WithBool:bool]과 [NSNumber number WithChar:char]를 보내서 전송된 매개 변수와 같은 유형의 각종 NSNumber 실례를 얻는다.NSNumber의 구체적인 하위 클래스를 만드는 방법과 관련된 모든 세부 사항은 NSNumber의 클래스 공장 방법에 의해 책임진다.[NSNumber numberWithBool:bool]의 경우 값 bool을 받아들이고 NSNumber의 내부 하위 클래스의 실례를 초기화하여 전송된 값 bool을 반영할 수 있도록 합니다.
공장 방법의 응용
우리는 하나의 협의를 통해 공장 대상이 같은 방법을 가지도록 했다. 협의에서 우리는 두 개의 숫자를 계산하는 데 사용할 계산 방법을 성명했다. 코드는 다음과 같다.
#import <Foundation/Foundation.h>

@protocol Calculate <NSObject>

@property (nonatomic, assign) float numberA;
@property (nonatomic, assign) float numberB;

- (float)calculate;

@end

그리고 우리는 두 가지 종류를 정의하여 구체적인 계산을 하는데 그것이 바로 구와 계산과 곱셈 계산이다. 코드는 다음과 같다.
#import <Foundation/Foundation.h>
#import "Calculate.h"
@interface AddCalculate : NSObject <Calculate>

- (float)calculate; // 

@end
#import "AddCalculate.h"

@implementation AddCalculate
@synthesize numberA = _numberA;
@synthesize numberB = _numberB;

- (float)calculate {
    return self.numberA + self.numberB;
}

@end
#import <Foundation/Foundation.h>
#import "Calculate.h"
@interface MultiplyCalculate : NSObject <Calculate>

- (float)calculate; 

@end
#import "MultiplyCalculate.h"

@implementation MultiplyCalculate
@synthesize numberA = _numberA;
@synthesize numberB = _numberB;
- (float)calculate {
    return self.numberA*self.numberB;
}

@end

이러한 구체적인 계산은 이미 이 두 가지 클래스에 의해 실현되었다. 다음은 우리가 해당하는 공장 방법을 만들고 먼저 추상적인 공장 클래스를 만들고 팩토리 코드는 다음과 같다.
#import <Foundation/Foundation.h>
#import "Calculate.h"
@interface Factory : NSObject <Calculate>

- (id)createFactory;

@end
#import "Factory.h"

@implementation Factory
@synthesize numberA = _numberA;
@synthesize numberB = _numberB;

- (id)createFactory {
    NSLog(@" , ");
    return nil;
}

- (float)calculate {
    return -1; // -1
}

@end

코드에서 추상적인 팩토리는 공장 방법이 만든 대상의 인터페이스를 정의한 것을 볼 수 있다.그러나 AddFactory 클래스의 코드는 다음과 같이 반환되는 객체의 하위 클래스에 따라 결정됩니다.
#import "Factory.h"

@interface AddFactory : Factory

- (id)createFactory; // 

@end
#import "AddFactory.h"
#import "AddCalculate.h"
@implementation AddFactory

- (id)createFactory {
    return [[AddCalculate alloc] init];
}

@end

MultiplyFactory 코드는 다음과 같습니다.
#import "Factory.h"

@interface MultiplyFactory : Factory

- (id)createFactory; 

@end
#import "MultiplyFactory.h"
#import "MultiplyCalculate.h"
@implementation MultiplyFactory

- (id)createFactory {
    return [[MultiplyCalculate alloc] init];
}

@end

코드에서 알 수 있듯이 AddFactory와MultiplyFactory는createFactory 인터페이스를 실현하고 대상을 되돌려 주는 공장 방법을 정의했다.다음은 클라이언트에서 공장 모드를 어떻게 사용하는지 살펴보겠습니다. 클라이언트 코드는 다음과 같습니다.
#import "ViewController.h"
#import "Calculate.h"
#import "AddCalculate.h"
#import "MultiplyCalculate.h"
#import "Factory.h"
#import "AddFactory.h"
#import "MultiplyFactory.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    Factory *factory = [[AddFactory alloc] init];
    Factory *calculate = [factory createFactory];
    calculate.numberA = 10.0;
    calculate.numberB = 20.0;
    
    float sum =  [calculate calculate];
    NSLog(@"sum is = %f", sum);
    
    Factory *factory1 = [[MultiplyFactory alloc] init];
    Factory *calculate1 = [factory1 createFactory];
    calculate1.numberA = 10.0;
    calculate1.numberB = 20.0;
    
    float multiply =  [calculate1 calculate];
    NSLog(@"sum is = %f", multiply);
    
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

출력은 다음과 같습니다.
2015-09-04 22:51:06.298 FactoryPattern[49484:2688173] sum is = 30.000000
2015-09-04 22:51:06.299 FactoryPattern[49484:2688173] multiply is = 200.000000

이 예에서 알 수 있듯이 공장 방법은 코드에서 응용 프로그램 특유의 클래스에 대한 결합을 없앴다.코드는 팩토리의 추상적인 인터페이스만 처리하기 때문에 같은 코드를 복용하여 응용 프로그램에서 사용자가 정의한 어떤 구체적인 클래스와 함께 작업을 할 수 있다.
demo 링크 주소:https://github.com/guoshimeihua/FactoryPattern.git

좋은 웹페이지 즐겨찾기