iOS 설계 모드 - 공장 모드
공장 방법도 허구조기라고도 하는데 이런 상황에 적용된다. 하나의 클래스는 어떤 종류의 대상을 생성해야 할지 예측할 수 없고 그 하위 클래스로 하여금 생성된 대상을 지정하게 한다.
공장 방법 모델: 창설 대상의 인터페이스를 정의하여 하위 클래스가 실례화된 클래스를 결정하도록 합니다.공장 방법은 한 종류의 실례화를 하위 종류로 늦추었다.
출하 방법 사용 시기
@: 컴파일할 때 만들 대상의 클래스를 정확하게 예상할 수 없습니다.
@: 클래스는 하위 클래스가 실행할 때 무엇을 만들지 결정하도록 합니다.
@: 클래스에는 하위 클래스가 있습니다. 하위 클래스로 돌아가는 정보를 국부화하고 싶습니다.
이 모델을 사용하는 최소한의 방법은 공장 방법이 어떤 대상을 변경하여 되돌려줄 수 있는지에 대해 더 많은 유연성을 줄 수 있다는 것이다.
플랜트 방법을 사용하여 객체를 작성하는 것은 새 특정 객체를 직접 작성하는 것보다 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.