Objective C 语言 工厂模式应用

Objective-C阿木 发布于 15 天前 6 次阅读


摘要:工厂模式是一种常用的设计模式,它可以将对象的创建与使用分离,提高代码的可扩展性和可维护性。本文将围绕Objective-C语言的工厂模式应用进行解析,并通过实际代码示例展示如何实现工厂模式。

一、工厂模式概述

工厂模式是一种创建型设计模式,它提供了一种创建对象的方法,将对象的创建与对象的逻辑分离,使得对象的创建过程更加灵活。工厂模式主要分为三种类型:简单工厂模式、工厂方法模式和抽象工厂模式。

二、Objective-C 工厂模式应用

1. 简单工厂模式

简单工厂模式是最基础的工厂模式,它通过一个工厂类来创建对象,避免了直接在客户端代码中创建对象,从而降低了耦合度。

以下是一个简单的Objective-C工厂模式的实现示例:

objective-c

// Product.h


@interface Product : NSObject


@property (nonatomic, strong) NSString name;


@end

// ConcreteProductA.h


@interface ConcreteProductA : Product


@end

// ConcreteProductA.m


@implementation ConcreteProductA


- (instancetype)initWithName:(NSString )name {


self = [super initWithName:name];


if (self) {


_name = @"ConcreteProductA";


}


return self;


}


@end

// ConcreteProductB.h


@interface ConcreteProductB : Product


@end

// ConcreteProductB.m


@implementation ConcreteProductB


- (instancetype)initWithName:(NSString )name {


self = [super initWithName:name];


if (self) {


_name = @"ConcreteProductB";


}


return self;


}


@end

// Factory.h


@interface Factory : NSObject


+ (Product )createProductWithType:(NSString )type;


@end

// Factory.m


@implementation Factory

+ (Product )createProductWithType:(NSString )type {


if ([type isEqualToString:@"A"]) {


return [[ConcreteProductA alloc] initWithName:@""];


} else if ([type isEqualToString:@"B"]) {


return [[ConcreteProductB alloc] initWithName:@""];


}


return nil;


}


@end

// 客户端代码


int main(int argc, const char argv[]) {


@autoreleasepool {


Product product = [Factory createProductWithType:@"A"];


NSLog(@"Product Name: %@", product.name);



product = [Factory createProductWithType:@"B"];


NSLog(@"Product Name: %@", product.name);


}


return 0;


}


2. 工厂方法模式

工厂方法模式是简单工厂模式的进一步抽象,它将对象的创建过程封装在一个单独的类中,使得创建过程更加灵活。

以下是一个工厂方法模式的实现示例:

objective-c

// Product.h


@interface Product : NSObject


@property (nonatomic, strong) NSString name;


@end

// ConcreteProductA.h


@interface ConcreteProductA : Product


@end

// ConcreteProductA.m


@implementation ConcreteProductA


- (instancetype)initWithName:(NSString )name {


self = [super initWithName:name];


if (self) {


_name = @"ConcreteProductA";


}


return self;


}


@end

// ConcreteProductB.h


@interface ConcreteProductB : Product


@end

// ConcreteProductB.m


@implementation ConcreteProductB


- (instancetype)initWithName:(NSString )name {


self = [super initWithName:name];


if (self) {


_name = @"ConcreteProductB";


}


return self;


}


@end

// Factory.h


@interface Factory : NSObject


+ (id)createProductWithType:(NSString )type;


@end

// FactoryA.h


@interface FactoryA : Factory


@end

// FactoryA.m


@implementation FactoryA

+ (id)createProductWithType:(NSString )type {


if ([type isEqualToString:@"A"]) {


return [[ConcreteProductA alloc] initWithName:@""];


}


return nil;


}


@end

// FactoryB.h


@interface FactoryB : Factory


@end

// FactoryB.m


@implementation FactoryB

+ (id)createProductWithType:(NSString )type {


if ([type isEqualToString:@"B"]) {


return [[ConcreteProductB alloc] initWithName:@""];


}


return nil;


}


@end

// 客户端代码


int main(int argc, const char argv[]) {


@autoreleasepool {


Factory factory = [[FactoryA alloc] init];


Product product = [factory createProductWithType:@"A"];


NSLog(@"Product Name: %@", product.name);



factory = [[FactoryB alloc] init];


product = [factory createProductWithType:@"B"];


NSLog(@"Product Name: %@", product.name);


}


return 0;


}


3. 抽象工厂模式

抽象工厂模式是工厂方法模式的进一步抽象,它定义了一个接口用于创建相关或依赖对象的家族,而不需要指定具体类。

以下是一个抽象工厂模式的实现示例:

objective-c

// Product.h


@interface Product : NSObject


@property (nonatomic, strong) NSString name;


@end

// ConcreteProductA.h


@interface ConcreteProductA : Product


@end

// ConcreteProductA.m


@implementation ConcreteProductA


- (instancetype)initWithName:(NSString )name {


self = [super initWithName:name];


if (self) {


_name = @"ConcreteProductA";


}


return self;


}


@end

// ConcreteProductB.h


@interface ConcreteProductB : Product


@end

// ConcreteProductB.m


@implementation ConcreteProductB


- (instancetype)initWithName:(NSString )name {


self = [super initWithName:name];


if (self) {


_name = @"ConcreteProductB";


}


return self;


}


@end

// AbstractFactory.h


@interface AbstractFactory : NSObject


- (Product )createProductA;


- (Product )createProductB;


@end

// ConcreteFactoryA.h


@interface ConcreteFactoryA : AbstractFactory


@end

// ConcreteFactoryA.m


@implementation ConcreteFactoryA

- (Product )createProductA {


return [[ConcreteProductA alloc] initWithName:@""];


}

- (Product )createProductB {


return [[ConcreteProductB alloc] initWithName:@""];


}


@end

// ConcreteFactoryB.h


@interface ConcreteFactoryB : AbstractFactory


@end

// ConcreteFactoryB.m


@implementation ConcreteFactoryB

- (Product )createProductA {


return [[ConcreteProductA alloc] initWithName:@""];


}

- (Product )createProductB {


return [[ConcreteProductB alloc] initWithName:@""];


}


@end

// 客户端代码


int main(int argc, const char argv[]) {


@autoreleasepool {


AbstractFactory factory = [[ConcreteFactoryA alloc] init];


Product productA = [factory createProductA];


Product productB = [factory createProductB];


NSLog(@"Product A Name: %@", productA.name);


NSLog(@"Product B Name: %@", productB.name);



factory = [[ConcreteFactoryB alloc] init];


productA = [factory createProductA];


productB = [factory createProductB];


NSLog(@"Product A Name: %@", productA.name);


NSLog(@"Product B Name: %@", productB.name);


}


return 0;


}


三、总结

本文通过对Objective-C语言工厂模式的解析,展示了简单工厂模式、工厂方法模式和抽象工厂模式的应用。工厂模式能够提高代码的可扩展性和可维护性,在实际开发中具有广泛的应用价值。通过合理运用工厂模式,可以降低对象创建过程中的耦合度,提高代码的复用性。