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不合适,我们将其实现单独放在一个简单工厂里面。 你会发现,每次不同的类型我们都要去修改简单工厂,牵一发而动,不符合设计模式的"对扩展开放,对修改关闭"的原则,工厂模式可以解决简单工厂无法解决的问题。
工厂模式
@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开发-工厂模式的更多相关文章
- iOS开发——工厂模式
工厂模式很好用,为表诚意,我直接搞个实用的例子放这,解析一个订单的数据,并且这个订单里面可能不止一件商品的做法. 还是直接上代码,不懂的地方,再提出来. 1.在MyOrderDeals.h文件中 #i ...
- iOS 抽象工厂模式
iOS 抽象工厂模式 什么是抽象工厂模式 简单了解一下 按照惯例,我们先了解一下什么是抽象工厂模式.抽象工厂模式和工厂方法模式很相似,但是抽象工厂模式将抽象发挥的更加极致,是三种工厂模式中最抽象的一种 ...
- iOS 简单工厂模式
iOS 简单工厂模式 什么是简单工厂模式? 简单工厂模式中定义一个抽象类,抽象类中声明公共的特征及属性,抽象子类继承自抽象类,去实现具体的操作.工厂类根据外界需求,在工厂类中创建对应的抽象子类实例并传 ...
- iOS开发-代理模式
代理模式有的时候也被称之为委托模式,但是实际上两者是有分别的,代理模式为另一个对象提供一个替身或占位符访问这个对象,代理对象和控制访问对象属于同一类,委托对象和对象不一定属于同一类.两者都可以控制类的 ...
- iOS开发-策略模式
策略(Strategy)模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.策略模式是对算法的包装,是把使用算法的责任和算法本身分割开 ...
- iOS开发-模板方法模式
模板方法模式定义一个操作中的算法的骨架,而将步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤.模板方法模式是由子类决定实现算法中的步骤,工厂方法由子类决定实现哪一 ...
- iOS开发-命令模式
命令模式算是设计模式中比较简单的,最常见的例子是工作任务安排下来进行编程,如果工作任务不需要完成,我们可以取消我们之前完成的代码,也可以理解为回滚撤销操作.这里面涉及到命令模式中的两个对象,一个是动作 ...
- iOS开发-状态模式
状态模式允许对象内部状态改变时改变它的行为,对象看起来好像修改了它的类.状态模式看起来和策略模式比较相像,策略模式是将可以互换的行为封装起来,然后通过使用委托的方式,决定使用哪一个行为,状态也是封装行 ...
- iOS开发-迭代器模式
迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示.开发过程中,我们可能需要针对不同的需求,可能需要以不同的方式来遍历整个整合对象,但是我们不希望 ...
随机推荐
- LeetCode(26): 删除排序数组中的重复项
Easy! 题目描述: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间 ...
- 执行 crontab 的计划任务
新建了一个 Laravel 的计划任务,配置好 crontab * * * * * php /www/sunzhongwei/artisan schedule:run >> /dev/nu ...
- HRBUST - 1818 石子合并 区间dp入门
有点理解了进阶指南上说的”阶段,状态和决策“ /* 区间dp的基础题: 以区间长度[2,n]为阶段,枚举该长度的区间,状态dp[l][r]表示合并区间[l,r]的最小费用 状态转移方程dp[l][r] ...
- python 全栈开发,Day52(关于DOM操作的相关案例,JS中的面向对象,定时器,BOM,client、offset、scroll系列)
昨日作业讲解: 京东购物车 京东购物车效果: 实现原理: 用2个盒子,就可以完整效果. 先让上面的小盒子向下移动1px,此时就出现了压盖效果.小盒子设置z-index压盖大盒子,将小盒子的下边框去掉, ...
- VMware虚拟机 Ubuntu 16.04 安装
第一步:VMware虚拟机 Ubuntu 16.04 安装 第二步: 解决窗口全屏问题 linux下给root用户设置密码 修改root用户的密码 $ sudo passwd root 密码会要求重复 ...
- Kylin的简介与安装部署
一.Kylin的概述 官方网址:http://kylin.apache.org/cn/ Apache Kylin™是一个开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析 ...
- Codeforces Round #144 (Div. 2) D table
CodeForces - 233D 题目大意给你一个n*m 的矩阵,要求你进行涂色,保证每个n*n的矩阵内都有k个点被涂色. 问你一共有多少种涂色方案. n<=100 && m& ...
- Linux 编译安装R语言
一.安装依赖包 yum install -y gcc gcc-gfortran glibc-headers readline-devel libXt-devel gcc-c++ xz-devel.x8 ...
- BZOJ3224 洛谷3369 Tyvj 1728 普通平衡树 splay
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3224 题意概括 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. ...
- Fibonacci PKU logn 求斐波那契的快速方法!!!
矩阵的快速幂 #include<cstdio> using namespace std; struct matrix { ][]; }ans,base; matrix multi( mat ...