iOS开发-工厂模式

工厂模式算是开发中比较常见的设计模式,简单工厂模式,工厂模式和抽象工厂模式,都属于工厂模式。单工厂模式(simple factory)是类的创建模式,静态工厂方法(static factory method)模式,简单工厂模式就是由一个工厂类根据传入的参数决定创建哪一种的产品类。简单工厂模式会包含过多的判断条件,维护起来不是特别方便,工厂模式是主要通过依赖倒置将类的实例化推迟到子类中,实现动态扩展。抽象工厂模式是一个对象产品家族,根据需求提供不同的对象。

简单工厂模式

之前的文章中写过一篇简单工厂模式,假设我们我有一个服装加工工厂,可以根据不同的需求生产不同的服饰,定义一个服装基类和工厂类:

@protocol DressProtocol <NSObject>

@optional
-(void)provideMaterial;

@optional
-(void)product;

@end

@interface Dress : NSObject<DressProtocol>

@end

服装Dress子类ForeignDress:

@implementation ForeignDress

-(void)provideMaterial{
    NSLog(@"ForeignDress--准备原材料");
}

-(void)product{
    NSLog(@"ForeignDress--生产");
}

@end

ChinaDress子类:

@implementation ChinaDress

-(void)provideMaterial{
    NSLog(@"ChinaDress---准备原材料");
}

-(void)product{
    NSLog(@"ChinaDress---生产");
}

@end

工厂类Manufactor:

@protocol ManufactorProtocol <NSObject>

@optional
-(Dress *)createDress:(NSString *)type;

@end

@interface Manufactor : NSObject<ManufactorProtocol>

-(void)start:(NSString *)type;

-(void)simpleStart:(NSString *)type;

-(void)startByCondition:(NSString *)type;

@end

方法实现:

-(void)start:(NSString *)type{
    if ([type isEqualToString:@"Foreign"]) {
        dress=[[ForeignDress alloc]init];
    }else if([type isEqualToString:@"China"]){
        dress=[[ChinaDress alloc]init];
    }
    [dress provideMaterial];
    [dress product];
}
//博客园-FlyElephant 简单工厂
-(void)simpleStart:(NSString *)type{
    dress=[ManuFactory dressInstance:type];
    [dress provideMaterial];
    [dress product];
}

方法调用:

    Manufactor  *factor=[[Manufactor alloc]init];
    [factor start:@"Foreign"];
    [factor simpleStart:@"China"];
    NSLog(@"博客园-FlyElephant");
    NSLog(@"http://www.cnblogs.com/xiaofeixiang/");

测试效果:

第一种我们在工厂中直接通过type类型判断,不同的类型生产不同的服装,但是如果type类型过多而且type实现的不一定的Dress服装类,所以放在Manufactor不合适,我们将其实现单独放在一个简单工厂里面。 你会发现,每次不同的类型我们都要去修改简单工厂,牵一发而动,不符合设计模式的"对扩展开放,对修改关闭"的原则,工厂模式可以解决简单工厂无法解决的问题。

工厂模式

假设公司效益比较好,工厂需要新增北京分厂,上海分厂的时候,这是时候通过简单工厂无法解决类扩展的问题,简单工厂之所以简单就是在于在同一个地方进行对象处理,工厂方法模式(Factory Method Pattern)工在基类中建立一个抽象方法,子类可以通过改写这一方法来改变创建对象的具体过程。工厂方法模式让子类来决定如何创建对象,来达到封装的目的。

假设我们新增了北京分厂,属于北京分厂的服装可以直接调用北京工厂来完成:

@implementation BJManufactor

-(Dress *)createDress:(NSString *)type{
    Dress *dress;
    if ([type isEqualToString:@"BJ"]) {
        dress=[[BJDress alloc]init];
    }else if([type isEqualToString:@"BJSpecial"]){
        dress=[[BJSpecialDress alloc]init];
    }
    return dress;
}

@end
Manufactor基类中的条件判断:
-(void)startByCondition:(NSString *)type{
    Dress *myDress=[self createDress:type];
    [myDress provideMaterial];
    [myDress product];
}

具体调用实现:

    Manufactor  *bjfactor=[[BJManufactor alloc]init];
    [bjfactor startByCondition:@"BJ"];
    NSLog(@"博客园-FlyElephant");
    NSLog(@"http://www.cnblogs.com/xiaofeixiang/");

效果:

从对象的创建来讲,这个将对象的创建扩展到了对象子类,从设计原则中中的依赖角度来看,原来的工厂需要依赖的各种具体的服装子类的引用,现在将这些进行各种分类,这里是以工厂的形式进行分类,抽象组件不依赖于具体的实现组件,已经完成的扩展可以不需要变化,如果有新增需求只需要增加新的功能接口,高层组件不需要太大的变化。

抽象工厂模式

抽象工厂模式提供一个接口,用于创建一个对象家族,而无需指定具体类。工厂方法只涉及到创建一个对象的情况,有时我们需要一族对象,上面我针对的对象是工厂,当我们需要工厂提供提供不同的原料,需要的不同的启动资金和人数,才能成立一个真正的工厂,将每个工厂都聚合在一起形成统一的接口,这样我们可以称之为

抽象工厂基类,这里只提供实现了Cloth:

@protocol AbstractFactory <NSObject>

@optional
-(Cloth *)provideCloth;

@end

@interface AbstractFactory : NSObject<AbstractFactory>

@end

抽象工厂子类BJAbstractFactory:

@implementation BJAbstractFactory

-(Cloth *)provideCloth{
    return [[Cloth alloc] init];
}

@end

Cloth类:

@implementation Cloth

-(void)clothMethod{
    NSLog(@"Cloth--Cloth");
}

@end

Manufactor类中添加两个新的方法:

-(void)configFactory:(AbstractFactory *)factory{
    abstractFactory=factory;
}

-(void)startWithFactory:(NSString *)type{
    Dress *myDress=[self createDress:type];
    cloth=[abstractFactory provideCloth];
    [cloth clothMethod];
    [myDress provideMaterial];
    [myDress product];
}

 方法调用:

    Manufactor  *factor=[[BJManufactor alloc]init];
    [factor configFactory:[[BJAbstractFactory alloc] init]];
    [factor startWithFactory:@"BJ"];
    NSLog(@"博客园-FlyElephant");
    NSLog(@"http://www.cnblogs.com/xiaofeixiang/");

 效果:

从实现逻辑来看抽象工厂模式和工厂模式和类似,抽象工厂模式的重点在于创建抽象接口来创建一组相关的产品。抽象工厂模式中,抽象工厂定义接口,所有的具体工厂必须实现该接口,该接口包含一组方法用来生产产品。每个具体工厂能够生产一整组的产品。工程实践中根据实际情况进行择优选择~

时间: 2024-10-08 12:59:11

iOS开发-工厂模式的相关文章

iOS开发-代理模式

代理模式有的时候也被称之为委托模式,但是实际上两者是有分别的,代理模式为另一个对象提供一个替身或占位符访问这个对象,代理对象和控制访问对象属于同一类,委托对象和对象不一定属于同一类.两者都可以控制类的访问,访问代理的方法A也就意味着访问对象的方法A,访问委托对象方法A执行的是可以是对象的方法B.从实际开发的角度看,委托属于代理模式的扩大版,并没有那么多的限制. 基础知识 代理模式相对比较简单,可以简单的看一下UML类图: 代理模式以便管理客户对对象的访问,管理访问的方式有很多种.远程代理管理客户

iOS设计模式——工厂模式

何为工厂方法模式? 工厂方法也称为虚构造器,它适用于这种情况:一个类无法预期需要生成哪个类的对象,想让其子类来指定所生成的对象. 工厂方法模式:定义创建对象的接口,让子类决定实例化哪一个类.工厂方法使得一个类的实例化延迟到其子类. 何时使用工厂方法 @:编译时无法准确预期要创建的对象的类. @:类想让子类决定运行时创建什么. @:类有若干辅助类为其子类,而你想要将返回哪个子类这一信息局部化. 使用这一模式的最低限度是,工厂方法能给予类在变更返回哪一种对象这一点上更多的灵活性. 与直接创建新的具体

iOS开发-策略模式

策略(Strategy)模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理.看到策略模式的时候有的时候跟简单工厂相比较,其实有很大的迷惑性,都是继承多态感觉没有太大的差异性,简单工厂模式是对对象的管理,策略模式是对行为的封装.可以先简单的看一下结构图: 之前简单工厂是通过银行卡作为例子的简单工厂将不同的银行卡抽象出来,如果在策略模式中我们可以将每张

iOS 之 工厂模式

参考:http://www.jikexueyuan.com/course/2054_2.html?ss=2 1. 简单工厂 简单工厂类是一个实体类.用于几种相似类的统一创建,简化流程,隔离细节. 下面是步骤: 1.1. 定义协议 工厂里可能生产几种产品,产品大同小异,所以需要定义协议. 1.2. 枚举 工厂产品的类型. 1.3. 实现各个类 按照协议,实现不同的类. 1.4. 生产出类实例 2. 抽象工厂

iOS开发-状态模式

状态模式允许对象内部状态改变时改变它的行为,对象看起来好像修改了它的类.状态模式看起来和策略模式比较相像,策略模式是将可以互换的行为封装起来,然后通过使用委托的方式,决定使用哪一个行为,状态也是封装行为,不同的是可以将行为委托到当前状态.一个需要从外部设置,一个是内部通过状态变更达到行为变成的目的. 基础知识 状态模式的UML类图: State封装基本的状态行为,我们通过Cotext上下文持有状态子类的实例,外部发起请求,我们就可以委托状态进行处理.地铁里面一般都有自动饮料售卖机,我们将所有的饮

iOS开发-简单工厂模式

设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.概念很长,iOS开发中最常遇到的有单例模式,观察者模式(KVO),简单工厂模式其实在开发中也非常常见,就是由工厂类根据传入的参数,动态决定应该创建出对应的产品类的实例. 基础概念 举一个生活的例子是我们有各种中字开头的银行卡,我们每天都会消费,消费的时候每个银行卡提示不同的信息,我们可以先抽象出来一个银行卡类: @inter

【iOS开发系列】用简单工厂模式理解OC反射机制

// 在iOS开发中,简单工厂模式使用得并不多.但是.我认为这是OC反射机制很好的一个例子, // 所以本文将以计算器为例,讲解简单工厂模式和OC的反射机制. // [简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类( // 这些产品类继承自一个父类或接口)的实例.该模式中包含的角色及其职责:工厂角色.抽 // 象产品角色.具体产品角色] // --百度百科 简单工厂模式 // 上面这句话可能不怎么好理解,我在网上找到了一个例子,可能例子本身不能完全解释这个 // 设

设计模式之工厂模式(iOS开发,代码用Objective-C展示)

<大话设计模式>这是一本经典之作,本来我该看<Objective-C编程之道:IOS设计模式解析 >,其实我也是先看的<Objective-C编程之道:IOS设计模式解析 >,但不得不说,其中内容有些深奥,理解起来比较困难.这与我一贯的学习方针不合,我更喜欢一个循序渐进的过程,从认知到实践再到思维上的一个比较深入的学习.然后有朋友向我推荐了<大话设计模式>这本书籍,初看,感觉很是符合我现在这个阶段,在此以前,我所编码中接触的设计模式都是比较简单的,在代码上也

IOS开发模式——单例

单例的模式在网上有很多,今天发下我个人对单例模式的理解.整个app中只存在一个实例,也只会进行一次实例,在实例完成之后是不可以人释放的(当App关闭之后,等系统自己回收). 也就是说,如果我们写得某个类符合了上述条件,那么我们也可以称这个类为单例. 在非ARC的工程中,我们需要针对alloc,retain,copy等会增加retaincount的参数加以控制,对release和autorelease等减少retailcount的操作增加控制,以确保单一实例,绝不释放. 在ARC的工厂中,由于,内