简单工厂模式是属于创建型模式,又叫做静态工厂方法(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. Greenplum查询计划分析

    这里对查询计划的学习主要是对TPC-H中Query2的分析. 1.Query的查询语句 select s_acctbal, s_name, n_name, p_partkey, p_mfgr, s_a ...

  2. 【转】Java提高篇(三四)-----fail-fast机制

    转自:http://blog.csdn.net/chenssy/article/details/38151189  在JDK的Collection中我们时常会看到类似于这样的话:         例如 ...

  3. 【java基础学习】-【泛型】

    参考以下几位同学的总结来学习: http://www.cnblogs.com/lwbqqyumidi/p/3837629.html#!comments http://www.weixueyuan.ne ...

  4. 【BZOJ1623】 [Usaco2008 Open]Cow Cars 奶牛飞车 贪心

    SB贪心,一开始还想着用二分,看了眼黄学长的blog,发现自己SB了... 最小道路=已选取的奶牛/道路总数. #include <iostream> #include <cstdi ...

  5. 【ORACLE】字符串操作 B字符串时A的一部分

    select * from a where instr(a,b)>0;用于实现B字段是A字段中的某一部分的时候,要论顺序或者要相邻的字符. 如果想要不论顺序或者不相邻的字符时,定义函数可以实现: ...

  6. Ajax基础(小猫)

    Ajax 1.什么是Ajax: 不用刷新整个页面便可与服务器通讯的办法 2.Ajax的基本使用 2.1XMLHttpRequest l XMLHttpRequest对象 XMLHttpRequest是 ...

  7. java反射学习之二万能EXCEL导出

    一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...

  8. 最小生成树 prime + 队列优化

    存图方式 最小生成树prime+队列优化 优化后时间复杂度是O(m*lgm) m为边数 优化后简直神速,应该说对于绝大多数的题目来说都够用了 具体有多快呢 请参照这篇博客:堆排序 Heapsort / ...

  9. PHP定界符使用技巧

    为什么要使用定界符 : 因为PHP是一个Web编程语言,在编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况,如果用传统的输出方法——按字符串输出的话,肯定要有大量的转 ...

  10. win7安装oracle 时容易出的问题

    Windows7下安装Oracle11G.10G,都会提示如下信息 正在检查操作系统要求... 要求的结果: 5.0,5.1,5.2,6.0 之一 实际结果: 6.1 检查完成.此次检查的总体结果为: ...