Objective-C 工厂模式(上) -- 简单工厂模式
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
定义解释的文字很单调, 下面举例说明
比如一个手机工厂, 它能生产iPhone, Android, Nokia三种手机.
这家工厂的营运模式为厂家直销, 就是直接卖给用户. 用户如果要买手机就直接给工厂下订单要什么手机, 工厂就直接要找客户要的型号生产一部手机出来给客户
这样我们就有3个因素: 工厂, 手机型号, 用户
下面我们构建代码
构建手机型号, 先定义一个基本手机模型 定义手机基本的功能, 打电话 发短信
我们通过协议的方式来定义
PhoneProtocol.h
#import <Foundation/Foundation.h> @protocol PhoneProtocol <NSObject> @required /**
打电话
*/
- (void)makePhoneCall; /**
发短信
*/
- (void)sendMessage; @end
下面开始创建手机模型
BaseDevice.h 手机基类
#import <Foundation/Foundation.h>
#import "PhoneProtocol.h" @interface BaseDevice : NSObject <PhoneProtocol> @end
BaseDevice.m
#import "BaseDevice.h"
@implementation BaseDevice
- (void)makePhoneCall {
}
- (void)sendMessage {
}
@end
iPhone模型
iPhonebaseDevice.h (假如iPhone有一个特别的功能, 指纹识别)
#import "BaseDevice.h" @interface iPhoneBaseDevice : BaseDevice - (void)fingerIdentifier; @end
iPhoneBaseDevice.m
#import "iPhoneBaseDevice.h"
@implementation iPhoneBaseDevice
- (void)makePhoneCall {
NSLog(@"iPhone makePhoneCall");
}
- (void)sendMessage {
NSLog(@"iPhone sendMessage");
}
- (void)fingerIdentifier {
NSLog(@"iPhone fingerIdentifier");
}
@end
Android手机
AndroidBaseDevice.h (假如Android手机有个特殊功能刷系统)
#import "BaseDevice.h" @interface AndroidBaseDevice : BaseDevice - (void)flashOS; @end
AndroidBaseDevice.m
#import "AndroidBaseDevice.h"
@implementation AndroidBaseDevice
- (void)makePhoneCall {
NSLog(@"Android makePhoneCall");
}
- (void)sendMessage {
NSLog(@"Android sendMessage");
}
- (void)flashOS {
NSLog(@"Android flashOS");
}
@end
Nokia手机
NokiaBaseDevice.h (假如Nokia手机一个特殊功能砸核桃)
#import "BaseDevice.h" @interface NokiaBaseDevice : BaseDevice - (void)knockNut; @end
NokiaBaseDevice.m
#import "NokiaBaseDevice.h"
@implementation NokiaBaseDevice
- (void)makePhoneCall {
NSLog(@"Nokia makePhoneCall");
}
- (void)sendMessage {
NSLog(@"Nokia sendMessage");
}
- (void)knockNut {
NSLog(@"Nokia knockNut");
}
@end
手机模型创建完了, 接着我们开始创建生产手机的工厂, 它有一个生产手机的方法
DeviceFactory.h
#import <Foundation/Foundation.h>
#import "iPhoneBaseDevice.h"
#import "NokiaBaseDevice.h"
#import "AndroidBaseDevice.h" typedef enum : NSUInteger {
kiPhone = 0x11,
kAndroid,
kNokia,
} EPhoneDevice; @interface DeviceFactory : NSObject /**
制造手机方法 @param type 手机类型
@return 手机实例
*/
+ (id <PhoneProtocol>)createPhoneWithDeviceType:(EPhoneDevice)type; @end
DeviceFactory.m
#import "DeviceFactory.h"
@implementation DeviceFactory
+ (id <PhoneProtocol>)createPhoneWithDeviceType:(EPhoneDevice)type {
BaseDevice *device = nil;
if (type == kiPhone) {
device = [[iPhoneBaseDevice alloc] init];
} else if (type == kNokia) {
device = [[NokiaBaseDevice alloc] init];
} else if (type == kAndroid) {
device = [[AndroidBaseDevice alloc] init];
}
return device;
}
@end
好了, 现在是用户就是我们 也就是Controller可以开始定做手机了
#import "ViewController.h"
#import "DeviceFactory.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //创建一个iPhone手机实例
iPhoneBaseDevice *phone = [DeviceFactory createPhoneWithDeviceType: kiPhone]; //打电话
[phone makePhoneCall]; //发短信
[phone sendMessage]; //指纹识别
[phone fingerIdentifier]; } @end
总结: 简单工厂方法就是定义创建对象的接口, 让子类决定实例化哪一个类. 工厂方法使得一个类的实例化延迟到其子类
何时使用工厂方法呢?
#1 编译时无法准确预期要创建的对象的类
#2 类想让其子类决定在运行时创建什么
#3 若有若干个辅助类为其子类, 而你想将返回哪个子类这一信息局部化
使用这一模式的最低限度是, 工厂方法能给予类在变更返回哪一种对象这一点上更多的灵活性
最后说明, 简单工厂模式可以比较清晰便捷的实现同一模型对象的创建
但有一个弊端就是, 只能定制创建已经写好的对象, 比如上面这个工厂只能生成iPhone/Android/Nokia这三种手机,
如果你想再定制华为手机或者小米手机, 那就要工厂去建华为和小米的手机生产线, 所以这种情况我们就要增加模型对象并修改工厂方法了
Objective-C 工厂模式(上) -- 简单工厂模式的更多相关文章
- 设计模式之工厂方法模式VS简单工厂方法模式
名词解释: 简单工厂:这个实在是没什么解释的,就是一个工厂类,然后有一个方法,根据传递的参数可以通过switch(你也可以是if,或者是使用高端的反射 )来进行对象的创建. 工厂方法:定义一个用于创建 ...
- Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
- Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式
工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...
- 【LabVIEW技巧】工厂模式_简单工厂
前言 上一个文章介绍了如何学习LabVIEW OOP,简要的提及了一些OOP学习中注意的事项,许多文章的读者反映写的太范,后文会逐步缩小范围,讨论在LabVIEW中各个模式的应用. 工厂模式概述 工厂 ...
- Java学习笔记——Java工厂模式之简单工厂
package com.app; import java.util.Date; /* * 工厂模式:简单工厂.工厂方法.抽象工厂 * * */ public class Test0718_Factor ...
- 设计模式(Java版)-创建型模式之简单工厂模式
前言:这段时间在学习设计模式,本人也是小菜一枚(所以写的如果有错误的地方请大大们给予指出).这个东西也是我一直想学习的,从点点滴滴做起,记录下自己每天的领悟! 一.工厂模式的动机 在软件系统中,经常面 ...
- C++设计模式 ==> 策略模式与简单工厂模式结合
简介 策略模式相较之于简单工厂模式适用于生产方法经常变化且方法较为繁多的情况,因为生产方法时常变化就会需要频繁修改工厂类,违背了开闭原则,这时就可以用策略选择类由客户端根据需求动态切换策略.且策略模式 ...
- 设计模式之策略模式&简单工厂模式
学习设计模式已经有非常长一段时间了,事实上先前已经敲过一遍了.可是老认为没有学到什么,认识也不够深刻.如今趁着重构机房,再又一次来过,也不晚. 事实上在敲了机房之后,看看模式,事实上,曾经非常难理解. ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂
简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...
随机推荐
- Linux学习笔记(15)-信号量
在多线程或者多进程编程中,有一个非常需要关注的东西,那就是同步以及互斥问题. 同步是指多个进程之间的协作,而互斥是指多个进程之间,为了争夺有限的资源,而进行的竞争. 理论很高端,但经过自己几天的学习, ...
- VS 编辑器扩展辅助工具
[工具]——[扩展和更新]——[联机]输入 C# outline 2015
- 条码固定资产管理PDA应用
条码固定资产管理解决方案 一.客户挑战与需求 随着企业经营管理的不断升级,固定资产管理的高效化.智能化管理越来越受到企业管理人员的重视.然而,固定资产具有数量大.种类多.价值高.使用周期长.使用地点分 ...
- 转:Delphi的类与继承(VB与delphi比较)
既然已经做出了com程序用delphi来开发的决定,那当然就要对delphi进行一些深入的了解.有人说delphi是一个用控件堆砌起来的工具,和vb没什么两样:也有人说dephi实际上是面向过程的,他 ...
- 2.1 -1.0 Xcode(发布时间、使用、快捷键、插件相关)
本文并非最终版本,如有更新或更正会第一时间置顶,联系方式详见文末 如果觉得本文内容过长,请前往本人 “简书” 1.0 Xcode 发布时间 版本 iOS 版本 手机 日期 特殊介绍 Xcode 3.1 ...
- 从零开始山寨Caffe·捌:IO系统(二)
生产者 双缓冲组与信号量机制 在第陆章中提到了,如何模拟,以及取代根本不存的Q.full()函数. 其本质是:除了为生产者提供一个成品缓冲队列,还提供一个零件缓冲队列. 当我们从外部给定了固定容量的零 ...
- 图论 - 寻找fly真迹
一天fly正坐在课堂上发呆,突然,他注意到了桌面上的一个字符串S1S2S3S4...Sn,这个字符串只由字符"a","b"和"c"构成.刚好 ...
- oracle 和c3p0 数据库的Time_Wait 过多问题的一个解决方案。
项目是B/S模式,放在linux服务器上,tomcat和oracle11g在一台服务器上,tomcat读取数据库采用C3P0连接池,一直比较稳定,所以也没有去管.后来把tomcat放在一台win200 ...
- WPF-系统托盘
WPFSystemTray.cs public class WPFSystemTray { /// <summary> /// 设置系统托盘 /// </summary> // ...
- A library of generic data structures
A library of generic data structures including a list, array, hashtable, deque etc.. https://github. ...