Objective-C 工厂模式

工厂是处理在不指定对象具体类型的情况下创建对象的问题。工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。
在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象。工厂是构造方法的抽象,用来实现不用的分配方案。
工厂对象通常包含一个或多个方法,用来创建这个工厂所能创建的各种类型的对象。这些方法可能接收参数,用来指定对象创建的方式,最后返回创建的对象。
抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。

      简单概括一下,一般工厂模式是工厂可以生产一种产品,多个型号。抽象工厂可以生产多个产品,多个型号。先上图,下图描述的就是一般工厂

Objective-C 工厂模式 - 勇者之尊 - 勇者之尊
      这里的话,工厂1就只能生产产品型号1,工厂2就只能生产产品型号2,下面用实际代码实现来描述一般工厂模式:
      这里声明一个交通工具产品,它包含了CarPlane两种型号的交通工具,这两种工具都有一个相同的动作就是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

下面就给出抽象工厂的图,具体实例就不再代码描述,大致意思如下:


Objective-C 工厂模式 - 勇者之尊 - 勇者之尊
 在Objective-C里面实际上是没有抽象类这个概念了,但是可以通过一些手段让某一个类达到抽象类的效果,此方法就是在直接调用抽象类的方法的时候抛出异常,例如:
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 }
posted @ 2014-08-23 21:33  激情为梦想而生  阅读(364)  评论(0编辑  收藏  举报