简单工厂模式是属于创建型模式,又叫做静态工厂方法(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. MySLQ 为数据库远程授权的方法与问题的解决解决方法

    Mysql通过远程的连接工具连接,提示Can't connect to MySQL server (10060).  这个时候我们需要分析,看哪里设置不当而导致的该问题.   工具/原料 mysql数 ...

  2. LintCode 78:Longest Common Prefix

      public class Solution { /** * @param strs: A list of strings * @return: The longest common prefix ...

  3. 【BZOJ1497】[NOI2006]最大获利 最小割

    裸的最小割,很经典的模型. 建图:要求总收益-总成本最大,那么将每条弧与源点相连,流量为成本,每个收益与汇点相连,流量为收益,然后每条弧与它所能到达的收益相连,流量为inf. 与源点相连的是未被选中的 ...

  4. Eclipse 双击变量,其他相同变量有底色

    转载:http://blog.csdn.net/majian_1987/article/details/46691697 方便下次查找. 在Eclipse中,鼠标选中或者光标移动到Java类的变量名时 ...

  5. windows service 1053错误 启动失败

    做项目移植的时候发现一个项目的window service启动失败,最后试出来是启动时间超时 解决办法是给window service设置一个长一点的等待时间,步骤如下: 启动,输入regedit启动 ...

  6. 【转】通过Hibernate将数据 存入oracle数据库例子

    一. Hibernate介绍 Hibernate是基于对象/关系映射(ORM,Object/Relational Mapping)的一个解决方案.ORM方案的思想是将对象模型表示的对象映射到关系型数据 ...

  7. Untiy3D开发小贴士 OnEnabled与OnDisabled

    设某个组件为NewBehaviour OnEnabled被调用的情况: 1.GameObject添加组件的时候,即AddComponet<NewBehaviour> : 2.包含3.已添加 ...

  8. 验证mongodb副本集并实现自动切换primary~记录过程

    接 验证mongodb主从复制过程 1.创建数据目录 同 验证mongodb主从复制过程 的实验一样,本次实验也是采用直接指定启动参数来启动mongodb数据库,本次实验我们需要启动三个数据库,为了与 ...

  9. CSS 页面顶部阴影和给浏览器强制加上滚动条

    /*给浏览器强制加上滚动条*/ html{height: 101%;} /*页面顶部阴影*/ body:before{ content: ""; position: fixed; ...

  10. Local Desktop

    Desktop: Paradigm System I:\Apps\Admin\ParaStart.bat Paradigm 1 Report Menu  I:\Apps\Admin\ParaStart ...