简单工厂模式是属于创建型模式,又叫做静态工厂方法(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. CentOS 6.5 Nginx 配置

    1.安装所有 http功能: ./configure --user=www-data --group=www-data --with-http_ssl_module --with-http_reali ...

  2. android 5.0以上通知栏、状态栏图标变成白色

    在5.0以上的系统上发现,平常的自定义notification出来的icon,居然在状态栏上变成了纯白色的icon. 看源代码会发现: protected void applyColorsAndBac ...

  3. C++ Primer Plus 第六版笔记

    C++ Primer Plus 第六版笔记 关于对象声明的思考 转自:http://www.cnblogs.com/weiqubo/archive/2009/11/02/1930042.html C+ ...

  4. iOS中push视图的时候,屏幕中间会出现一条灰色的粗线的解决方案

    因为执行动画需要时间,所以在动画未完成又执行另一个切换动画,容易产生异常.所以在一个方法连续push不同的VC是没有问题的,但是不小心push同一个VC,并且animated为YES,可能多次跳转了 ...

  5. Codeforces Round #361 (Div. 2) A

    A - Mike and Cellphone Description While swimming at the beach, Mike has accidentally dropped his ce ...

  6. 安装WampServer时出现的问题(丢失VCRUNTIME140.dll或MSVCR110.dll)以及解决办法

    今天,在安装WampServer时,刚开始提示了"丢失VCRUNTIME140.dll"的问题. 我就网上查了一下,结果大家说是没有安装VC++,然后我就按照网友们提供的网址去下载 ...

  7. Flask 重新认识

    总是觉的学习东西有点猴子掰玉米的感觉.今天就重新再掰一次吧. Installation: 安装之前建议先安装virtualenv,这个东东是帮助你在多个python版本之间保持同步,不至于python ...

  8. 转载:iOS开发之让你的应用“动”起来

    在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画.动画 ...

  9. linux opensuse 程序中上传文件大小限制

    上传文件大小限制 修改nginx主配置文件 /etc/nginx/nginx.conf增加配置 client_max_body_size 40m;  (说明:这里40m是最大支持上传40兆)

  10. iOS app上架需要提前准备的东西

    APP icon,要求1024*1024并且不能有圆角效果. 不同屏幕的截图 3.5的,4的,4.7的,5.5的 测试账号,即登录的账号密码(不能删除或更改的) 联系人电话,电子邮件 对项目的描述 关 ...