简单工厂模式是属于创建型模式,又叫做静态工厂方法(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 工厂模式(上) -- 简单工厂模式的更多相关文章

  1. 设计模式之工厂方法模式VS简单工厂方法模式

    名词解释: 简单工厂:这个实在是没什么解释的,就是一个工厂类,然后有一个方法,根据传递的参数可以通过switch(你也可以是if,或者是使用高端的反射 )来进行对象的创建. 工厂方法:定义一个用于创建 ...

  2. Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

  3. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

  4. 【LabVIEW技巧】工厂模式_简单工厂

    前言 上一个文章介绍了如何学习LabVIEW OOP,简要的提及了一些OOP学习中注意的事项,许多文章的读者反映写的太范,后文会逐步缩小范围,讨论在LabVIEW中各个模式的应用. 工厂模式概述 工厂 ...

  5. Java学习笔记——Java工厂模式之简单工厂

    package com.app; import java.util.Date; /* * 工厂模式:简单工厂.工厂方法.抽象工厂 * * */ public class Test0718_Factor ...

  6. 设计模式(Java版)-创建型模式之简单工厂模式

    前言:这段时间在学习设计模式,本人也是小菜一枚(所以写的如果有错误的地方请大大们给予指出).这个东西也是我一直想学习的,从点点滴滴做起,记录下自己每天的领悟! 一.工厂模式的动机 在软件系统中,经常面 ...

  7. C++设计模式 ==> 策略模式与简单工厂模式结合

    简介 策略模式相较之于简单工厂模式适用于生产方法经常变化且方法较为繁多的情况,因为生产方法时常变化就会需要频繁修改工厂类,违背了开闭原则,这时就可以用策略选择类由客户端根据需求动态切换策略.且策略模式 ...

  8. 设计模式之策略模式&amp;简单工厂模式

    学习设计模式已经有非常长一段时间了,事实上先前已经敲过一遍了.可是老认为没有学到什么,认识也不够深刻.如今趁着重构机房,再又一次来过,也不晚. 事实上在敲了机房之后,看看模式,事实上,曾经非常难理解. ...

  9. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂

    简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...

随机推荐

  1. NXP恩智浦P87C51/52/54/58/591芯片解密单片机破解多少钱?

    NXP恩智浦P87C51/52/54/58/591芯片解密单片机破解 芯片解密型号: P87C51x2.P87C52x2.P87C54x2.P87C58x2.P87C591  单片机解密 #####[ ...

  2. 活动助手Beta用户试用报告

    用户试用报告 1.面向参与者用户 1.1 日常参加各类学习(水综测)活动中,有没有遇到以下问题: (1) 信息来源混乱,不知道靠不靠谱 (2) 每次报名都要重新填写自己的学号手机号,有时候填错了就没综 ...

  3. SparkLauncher 1.6 版本bug

    背景 近期在研究使用java api的方式来调用Spark程序,通过句柄的方式来完成监控Job运行状态.及时杀死Job等功能.官方文档直接指出使用Java/Scala创建Job的方式——利用Spark ...

  4. Python 进程间通信

    from multiprocessing import Process,Queue import os,time,random def write(q): print('Process to writ ...

  5. linu for循环

    用途说明 在shell中用于循环.类似于其他编程语言中的for,但又有些不同.for循环是Bash中最常用的语法结构. 常用格式 格式一 for 变量 do 语句 done 格式二 for 变量 in ...

  6. SQL 提高查询效率

    1.关于SQL查询效率,100w数据,查询只要1秒,与您分享: 机器情况p4: 2.4内存: 1 Gos: windows 2003数据库: ms sql server 2000目的: 查询性能测试, ...

  7. 数字对象NSNumber

    //将int类型转化成对象 ; NSNumber *numberString = [NSNumber numberWithInt:number]; //对象是可以放入数组的 NSArray *arra ...

  8. 关于 Raphael

    Raphael Javascript 是一个 Javascript的矢量库. 2010年6月15日,著名的JavaScript库ExtJS与触摸屏代码库项目jQTouch,以及SVG.VML处理库Ra ...

  9. CSS中"!important"的使用

    本篇文章使用最新的IE10以及firefox与chrome测试(截止2013年5月27日22:23:22) CSS的原理: 我们知道,CSS写在不同的地方有不同的优先级, .css文件中的定义 < ...

  10. 在线Spirte图定位工具,自动生成CSS

    发现一个在线雪碧图中的图片地位的工具,并且能够自动生成css.spritecow 废话不多说,有图有真相: