Objective-C设计模式——工厂方法模式virtual constructor(对象创建)

工厂方法模式

工厂方法模式可以控制对象的创建过程,屏蔽对象创建的细节,可以直接创建出我们所需要的已经配置好的对象。

工厂方法模式定义了创建方法的接口,让子类决定实例化哪一个类,工厂方法模式使得一个类的实例化延迟到其子类。

工厂方法的工厂其实是多太的一个经典应用,而其生产的产品取决于使用什么工厂,符合面向对象设计的开放封闭原则,添加产品只需要添加新的类,而不需要修改原有的代码。

 

使用场景

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

posted @ 2015-07-19 22:14  愤怒大熊猫  阅读(525)  评论(0编辑  收藏  举报