工厂模式算是开发中比较常见的设计模式,简单工厂模式,工厂模式和抽象工厂模式,都属于工厂模式。单工厂模式(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/");

 效果:

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

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

  1. iOS开发——工厂模式

    工厂模式很好用,为表诚意,我直接搞个实用的例子放这,解析一个订单的数据,并且这个订单里面可能不止一件商品的做法. 还是直接上代码,不懂的地方,再提出来. 1.在MyOrderDeals.h文件中 #i ...

  2. iOS 抽象工厂模式

    iOS 抽象工厂模式 什么是抽象工厂模式 简单了解一下 按照惯例,我们先了解一下什么是抽象工厂模式.抽象工厂模式和工厂方法模式很相似,但是抽象工厂模式将抽象发挥的更加极致,是三种工厂模式中最抽象的一种 ...

  3. iOS 简单工厂模式

    iOS 简单工厂模式 什么是简单工厂模式? 简单工厂模式中定义一个抽象类,抽象类中声明公共的特征及属性,抽象子类继承自抽象类,去实现具体的操作.工厂类根据外界需求,在工厂类中创建对应的抽象子类实例并传 ...

  4. iOS开发-代理模式

    代理模式有的时候也被称之为委托模式,但是实际上两者是有分别的,代理模式为另一个对象提供一个替身或占位符访问这个对象,代理对象和控制访问对象属于同一类,委托对象和对象不一定属于同一类.两者都可以控制类的 ...

  5. iOS开发-策略模式

    策略(Strategy)模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.策略模式是对算法的包装,是把使用算法的责任和算法本身分割开 ...

  6. iOS开发-模板方法模式

    模板方法模式定义一个操作中的算法的骨架,而将步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤.模板方法模式是由子类决定实现算法中的步骤,工厂方法由子类决定实现哪一 ...

  7. iOS开发-命令模式

    命令模式算是设计模式中比较简单的,最常见的例子是工作任务安排下来进行编程,如果工作任务不需要完成,我们可以取消我们之前完成的代码,也可以理解为回滚撤销操作.这里面涉及到命令模式中的两个对象,一个是动作 ...

  8. iOS开发-状态模式

    状态模式允许对象内部状态改变时改变它的行为,对象看起来好像修改了它的类.状态模式看起来和策略模式比较相像,策略模式是将可以互换的行为封装起来,然后通过使用委托的方式,决定使用哪一个行为,状态也是封装行 ...

  9. iOS开发-迭代器模式

    迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示.开发过程中,我们可能需要针对不同的需求,可能需要以不同的方式来遍历整个整合对象,但是我们不希望 ...

随机推荐

  1. 优化MVC,实现数据库表的记录的添加、删除、修改、查询。

    一.在UserDAO里面重写实体user要调用的方法: 1.查询所有user表中的记录.用getAllUser()方法得到List public class UserDAO { public List ...

  2. javafx点击鼠标出现弹窗,demo

    在学习javafx的过程中,不知道怎么出现一个弹窗,如,点击一个按钮出现一个修改信息的列表选项 终于在javafx文档示例中发现了类似的东西,记录一下,备忘package demo9_button; ...

  3. ubuntu ufw防火墙软件的配置入门

    顺便,一条龙作完安全吧. ufw的使用,是比iptables简单.但只能作简单的事儿,更改简单的netfilter里的iptable里的记录.难点的,可能还是得iptables原生命令. 自打2.4版 ...

  4. sublime断点调试

    系统重装了之后以前装好的zendstudio的xDebug又不能用了 搞了一天,放弃了 看到sublime也能调试,我就用sublime了 首先要下sublime插件 链接:http://pan.ba ...

  5. canvas放射粒子效果

    这个也是别人的代码,就不多介绍了 写了些注释 body { overflow:hidden; margin:0; padding:0; background-color:#222222 } </ ...

  6. C# Winform将控件作为参数传递

    最近做个Winform 的程序设计,需要将窗体的控件作为参数传递到另外一个类的函数中去使用,每次都会忘记,简单的记下来,以备即时查看. 1. 设置控件的modifier属性设置为public 2. 以 ...

  7. python全栈开发day27-网络编程

    回顾:1.两个架构:C/S   B/S(统一了应用的接口)2.同一个电脑两个py文件通信(文件)3.两个电脑通信---网线4.交换机的通信方式:广播.单播.组播5.arp协议:通过ip地址找到对应的m ...

  8. Codeforces 247D Mike and Fish

    Mike and Fish 我们可以把这个模型转换一下就变成有两类点,一类是X轴, 一类是Y轴, 每个点相当于对应的点之间建一条边, 如果这条边变红两点同时+1, 变蓝两点同时-1. 我们能发现这个图 ...

  9. BZOJ1078 [SCOI2008]斜堆 堆

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1078 题意概括 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的 ...

  10. streaming优化:spark.streaming.receiver.maxRate

    使用spark.streaming.receiver.maxRate来限制你的吞吐的最大信息量. 因为当streaming程序的数据源的数据量突然变大巨大,可能会导致streaming被撑住导致吞吐不 ...