工厂是处理在不指定对象具体类型的情况下创建对象的问题。工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。
在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象。工厂是构造方法的抽象,用来实现不用的分配方案。
工厂对象通常包含一个或多个方法,用来创建这个工厂所能创建的各种类型的对象。这些方法可能接收参数,用来指定对象创建的方式,最后返回创建的对象。
抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。
简单概括一下,一般工厂模式是工厂可以生产一种产品,多个型号。抽象工厂可以生产多个产品,多个型号。先上图,下图描述的就是一般工厂
这里的话,工厂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
下面就给出抽象工厂的图,具体实例就不再代码描述,大致意思如下:
在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 }
激情为梦想而生