工厂方法模式
工厂方法模式可以控制对象的创建过程,屏蔽对象创建的细节,可以直接创建出我们所需要的已经配置好的对象。
工厂方法模式定义了创建方法的接口,让子类决定实例化哪一个类,工厂方法模式使得一个类的实例化延迟到其子类。
工厂方法的工厂其实是多太的一个经典应用,而其生产的产品取决于使用什么工厂,符合面向对象设计的开放封闭原则,添加产品只需要添加新的类,而不需要修改原有的代码。
使用场景
1.编译时无法准确预期要创建的对象的类;
2.类想让其子类决定在运行时创见什么;
3.类有若干辅助类为其子类,而你想返回那个子类这一信息局部化。
举个最简单的例子,NSNumber这个类,可以使用[[NSNumber alloc] init]来创建实例,但是并没有什么用,除非使用预先定义的工厂方法才有用,
例如:[NSNumber numberWithBool:YES]消息会得到NSNumber的子类NSCFBoolean的一个实例。
创建对象的安全方法
因为客户端并不需要创建对象的实现细节,细节都会在工厂方法中得到实现,并且返回最终的产品,如果想要添加新的产品,不需要修改客户端接口,只需要修改工厂方法即可。
对象工厂方法和类工厂方法
个人觉得类工厂方法其实就是简单工厂的一种体现,只需要调用不同的方法或者传递不同的参数来实例化不同的子类。但是这种方法每次添加新产品时都要在抽象类中添加对应的方法,并不符合开放封闭原则,对象工厂方法模式只需要添加新的类就可以实现我们想要的效果。
Demo
内容比较多:
工厂类
#import <Foundation/Foundation.h> @interface Factory : NSObject -(id)createProduct; @end #import "Factory.h" #import "Product.h" @implementation Factory -(id)createProduct{ return [[Product class] new]; } @end
#import "Factory.h" @interface FactoryType1 : Factory @end #import "FactoryType1.h" #import "ProductType1.h" @implementation FactoryType1 -(id)createProduct{ return [[ProductType1 class] new]; } @end #import "Factory.h" @interface FactoryType2 : Factory @end #import "FactoryType2.h" #import "ProductType2.h" @implementation FactoryType2 -(id)createProduct{ return [[ProductType2 class] new]; } @end
产品类
#import <Foundation/Foundation.h> @interface Product : NSObject @property(nonatomic, strong) NSString *name; @end #import "Product.h" @implementation Product -(id)init{ if(self){ _name = @"product"; } return self; } @end #import "Product.h" @interface ProductType1 : Product @end #import "ProductType1.h" @implementation ProductType1 -(id)init{ if(self){ self.name = @"productType1"; } return self; } @end #import "Product.h" @interface ProductType2 : Product @end #import "ProductType2.h" @implementation ProductType2 -(id)init{ if(self){ self.name = @"productType2"; } return self; } @end
客户端:
Factory *factory1 = [FactoryType1 new]; Product *product1 = [factory1 createProduct]; NSLog(@"%@",product1.name); Factory *factory2 = [FactoryType2 new]; Product *product2 = [factory2 createProduct]; NSLog(@"%@",product2.name); return 0; /* *2015-07-19 22:11:13.590 Factory Methods[32054:8351400] productType1 *2015-07-19 22:11:13.591 Factory Methods[32054:8351400] productType2 */
可以看到,打印结果,我们只改变了初始化子类,对应就产生出了不同的产品。
对于类工厂方法就不做演示了,可以参看NSNumber