Objective-C 工厂模式
工厂是处理在不指定对象具体类型的情况下创建对象的问题。工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。
在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象。工厂是构造方法的抽象,用来实现不用的分配方案。
工厂对象通常包含一个或多个方法,用来创建这个工厂所能创建的各种类型的对象。这些方法可能接收参数,用来指定对象创建的方式,最后返回创建的对象。
抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。
简单概括一下,一般工厂模式是工厂可以生产一种产品,多个型号。抽象工厂可以生产多个产品,多个型号。先上图,下图描述的就是一般工厂
这里的话,工厂1就只能生产产品型号1,工厂2就只能生产产品型号2,下面用实际代码实现来描述一般工厂模式:
这里声明一个交通工具产品,它包含了Car和Plane两种型号的交通工具,这两种工具都有一个相同的动作就是run。
1 @interface Vehicle : NSObject{ 2 } 3 - (void)run; 4 @end 5 6 @implementation Vehicle 7 - (void)run{ 8 } 9 @end 10 11 12 @interface Car : Vehicle{ 13 } 14 - (void)run; 15 @end 16 17 @implementation Car 18 - (void)run{ 19 NSLog(@"汽车在公路上跑"); 20 } 21 @end 22 23 24 @interface Plane : Vehicle{ 25 } 26 - (void)run; 27 @end 28 29 @implementation Plane 30 - (void)run{ 31 NSLog(@"飞机在天上飞"); 32 } 33 @end
上面我们定义了交通工具里面的两种产品,下面我们将定义生产这些交通工具的工厂:
@interface VehicleFactory : NSObject{ } - (Vehicle *)createVehicle; @end @implementation VehicleFactory - (Vehicle *)createVehicle{ } @end @interface CarFactory : VehicleFactory{ } - (Vehicle *)createVehicle; @end @implementation CarFactory - (Vehicle *)createVehicle{ return [[[Car alloc] init] autorelease]; } @end@interface PlaneFactory : VehicleFactory{ } - (Vehicle *)createVehicle; @end @implementation PlaneFactory - (Vehicle *)createVehicle{ return [[[Plane alloc] init] autorelease]; } @end
现在我们具体使用:
1 @interface UseVehicle : NSObject{ 2 } 3 - (void)useVehicle; 4 @end 5 6 @implementation UseFactory 7 - (void)useVehicle{ 8 VehicleFactory *factory = [[CarFactory alloc] init]; 9 Vehicle *vehicle = [factory createVhicle]; 10 [vehicle run]; 11 //这里是创建了一辆汽车,如果要换成飞机,只需在实例化工厂的时候用PlaneFactory就可以。 12 } 13 @end
下面就给出抽象工厂的图,具体实例就不再代码描述,大致意思如下:
1 - (id)someMethod:(SomeObject *)blah 2 { 3 @throw [NSException exceptionWithName:NSInternalInconsistencyException 4 reason:[NSString stringWithFormat:@"You must override %@ in a subclass", 5 NSStringFromSelector(_cmd)] 6 userInfo:nil]; 7 }
1 - (id)init 2 { 3 if ([self class] == [FastEnumerable class]) { 4 @throw [NSException exceptionWithName:NSInternalInconsistencyException 5 reason:@"Error, attempting to instantiate AbstractClass directly." userInfo:nil]; 6 } 7 8 self = [super init]; 9 if (self) { 10 // Initialization code here. 11 } 12 13 return self; 14 }
激情为梦想而生