工厂模式
[TOC]
工厂模式分为简单工厂和抽象工厂,抽象工厂只是在简单工厂上面多加了一个封装层。
- 优点:职责单一,实现了接口隔离,有利用解耦合。
- 缺点:违反了高内聚职责分配原则,也违背了开放封闭原则,所以适应于简单的类。
简单工厂
简单工厂是一个具体的类,制造对象,简化流程并且封装对外不可见。
封装按钮的Demo
#import <UIKit/UIKit.h>
/**
用户界面工厂类
作用: 负责创建用户界面需要的视图
设计: 简单工厂模式
*/
@interface CDUIFactory : NSObject
+ (UIButton *) createButtonWithRect:(CGRect) rect title:(NSString *) title image:(NSString *) imageName bgImage:(NSString *) bgImageName target:(id) target action:(SEL) sel;
@end
//实现部分用了一些已经封装好的方法
#import "CDUIFactory.h"
@implementation CDUIFactory
+ (UIButton *)createButtonWithRect:(CGRect)rect title:(NSString *)title image:(NSString *)imageName bgImage:(NSString *)bgImageName target:(id)target action:(SEL)sel {
// 创建自定义类型的按钮
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
// 指定按钮的尺寸和位置
button.frame = rect;
// 根据参数定制按钮
if (title) {
[button setTitle:title forState:UIControlStateNormal];
}
if (imageName) {
if ([imageName hasPrefix:@"http"]) {
[button sd_setImageWithURL:[NSURL URLWithString:imageName] forState:UIControlStateNormal];
}
else {
[button setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
}
}
if (bgImageName) {
if ([bgImageName hasPrefix:@"http"]) {
[button sd_setBackgroundImageWithURL:[NSURL URLWithString:bgImageName] forState:UIControlStateNormal];
}
[button setBackgroundImage:[UIImage imageNamed:bgImageName] forState:UIControlStateNormal];
}
if (target && sel) {
[button addTarget:target action:sel forControlEvents:UIControlEventTouchUpInside];
}
// 设置按钮标题颜色
[button setTitleColor:[UIColor buttonTitleColor] forState:UIControlStateNormal];
// 设置按钮标题字体
button.titleLabel.font = [UIFont defaultFont];
return button;
}
@end
抽象工厂
抽象工厂比简单工厂多了一个抽象层,下面是一堆得简单工厂。当简单工厂继承抽象工厂时重写父类的方法。抽象工厂是面向接口编程。