工厂模式浅析
来源:互联网 发布:怎么更改软件版本号 编辑:程序博客网 时间:2024/06/11 14:18
首先工厂模式其实分为简单工厂,工厂方法和抽象工厂,工厂模式其实就是我需要什么,这个工厂就给我制造什么。
关于简单工厂模式的应用如下所示:
首先中定义一个抽象类,抽象类中写一些我们需要的抽象方法或者属性,抽象子类去继承这个抽象类,然后再去实现具体的操作。然后工厂类根据外界的需求去创建对应的抽象子类实例并传给外界,而对象的创建是什么类型是由外界决定的。外界只需要知道抽象子类与之对应的参数即可,而不需要知道抽象子类的创建过程。
简单工厂模式就是将对象的创建和要创建对象需要的业务逻辑分离,这样的话可以降低操作对象的耦合度。由于工厂类只是为外界创建对象,所以并不需要实例化工厂类对象,只需要为外界提供类方法即可。举个例子如下所示 比如说我们有一个水果工厂,我们可以在里面创建水果,就根据外面外面传入的枚举值的不同创建不同的水果。水果实例的创建是依赖于工厂的
typedef NS_ENUM(NSInteger) { kApple, kOrange, kBanana} FruitsType;工厂方法
+ (Fruits *)fruitsFactory:(FruitsType)type { Fruits *fruits = nil; switch (type) { case kApple: fruits = [[Apple alloc] init]; break; case kOrange: fruits = [[Orange alloc] init]; break; case kBanana: fruits = [[Banana alloc] init]; default: break; } return fruits;}然后再去创建一个抽象水果类
#import <Foundation/Foundation.h>@interface Fruits : NSObject@end然后再去创建具体的这个抽象类的子类,Apple Orange,Banana。就可以了,然后在外界调用的时候只用这么调用就可以了,这样就可以创建出苹果了。
Apple *apple = (Apple *)[FruitsFactory fruitsFactory:kApple];
当然如果是这样的话那么我们如果要再去增加产品的话肯定又要再去写多写个枚举值以及switch case还要去判断,如果这样的话那么各种判断写在一起肯定是不好维护的,所以这个时候我们可以去使用工厂模式,如果说简单工厂模式是一个工厂生产多个产品,那么工厂方法模式就是每一个厂去制造自己的那个产品。就比如说我们首先有一个抽象厂,然后这个抽象的厂后面还有抽象的子厂,子厂当中负责创建自己相应的产品,然后产品的抽象类我们也要去创建,后面的产品的抽象子类就是去继承它,和我们前面工厂的抽象子类其实是一一对应的关系。
抽象工厂其实就是指如果一个工厂可以生产多个产品,就比如说我有一个抽象工厂可以创建空调和冰箱,然后这个抽象工厂下面可以创建出一个格力工厂,美的工厂,格力工厂可以创造空调和冰箱,当然美的工厂也可以。这样其实就可以解决我工厂方法中无法解决的一个工厂中创造对个产品并且可以相对每一个产品还可以进行对比。
关于抽象工厂和工厂方法的区别如下所示
抽象工厂的话其实就是在一个类中可以创建多个系列的产品,但是必须要去修改工厂抽象类的接口才可以去创建新的产品
工厂方法的话其实就是通过类的继承去创建抽象的产品,每个工厂只能创建一个产品,要创建新的产品就去创建工厂的抽象子类,然后再去创建产品类。
在ios中其实NSNumber就用到了工厂模式,我们初始化NSNumber会发现它为nil。
参考文章:http://blog.jobbole.com/109594/
- 浅析工厂模式
- 简单工厂模式浅析
- 工厂方法模式浅析
- 工厂模式浅析
- 一个工厂模式的浅析
- 浅析设计模式之抽象工厂模式
- 浅析单例模式和工厂模式
- 浅析设计模式之工厂方法
- 浅析面向对象(工厂模式)
- 设计模式之装饰模式、工厂方法模式、抽象工厂模式浅析
- 浅析JAVA设计模式之工厂模式(一)
- 浅析JAVA设计模式之工厂模式(二)
- 浅析JAVA设计模式之工厂模式(三)
- IOS设计模式浅析之简单工厂模式(SimpleFactory)
- iOS设计模式浅析之抽象工厂设计模式
- 设计模式—浅析三种工厂模式的特点
- 设计模式:浅析 抽象工厂、工厂方法、简单(静态)工厂 java实现
- 浅析Command模式,反射工厂在系统中的应用
- (未完待续)
- CSV文件简介
- nginx 安装
- 蓝桥杯: 完美的代价
- Retrofit的简单使用
- 工厂模式浅析
- Ubuntu 14.04安装SecureCRT 8.0.0
- 天梯赛-L3-004. 肿瘤诊断(三维空间+广搜)
- 在排序好的数组中添中一个数字
- GithubPages教程 在GithubPages上搭建个人主页
- ubuntu 图片格式批量转换,批量处理
- tomcat日志分割
- 9轴传感器
- 实现分布式锁的三中方式