Objective-C 工厂模式(上) -- 简单工厂模式

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

定义解释的文字很单调, 下面举例说明

比如一个手机工厂,  它能生产iPhone, Android, Nokia三种手机.

这家工厂的营运模式为厂家直销, 就是直接卖给用户. 用户如果要买手机就直接给工厂下订单要什么手机, 工厂就直接要找客户要的型号生产一部手机出来给客户

这样我们就有3个因素: 工厂, 手机型号, 用户

下面我们构建代码

构建手机型号, 先定义一个基本手机模型 定义手机基本的功能, 打电话 发短信

我们通过协议的方式来定义

PhoneProtocol.h

 1 #import <Foundation/Foundation.h>
 2
 3 @protocol PhoneProtocol <NSObject>
 4
 5 @required
 6
 7 /**
 8  打电话
 9  */
10 - (void)makePhoneCall;
11
12 /**
13  发短信
14  */
15 - (void)sendMessage;
16
17 @end

下面开始创建手机模型

BaseDevice.h 手机基类

1 #import <Foundation/Foundation.h>
2 #import "PhoneProtocol.h"
3
4 @interface BaseDevice : NSObject <PhoneProtocol>
5
6 @end

BaseDevice.m

 1 #import "BaseDevice.h"
 2
 3 @implementation BaseDevice
 4
 5 - (void)makePhoneCall {
 6
 7 }
 8
 9 - (void)sendMessage {
10
11 }
12
13 @end

iPhone模型

iPhonebaseDevice.h (假如iPhone有一个特别的功能, 指纹识别)

1 #import "BaseDevice.h"
2
3 @interface iPhoneBaseDevice : BaseDevice
4
5 - (void)fingerIdentifier;
6
7 @end

iPhoneBaseDevice.m

 1 #import "iPhoneBaseDevice.h"
 2
 3 @implementation iPhoneBaseDevice
 4
 5 - (void)makePhoneCall {
 6
 7     NSLog(@"iPhone makePhoneCall");
 8 }
 9
10 - (void)sendMessage {
11
12     NSLog(@"iPhone sendMessage");
13 }
14
15 - (void)fingerIdentifier {
16
17     NSLog(@"iPhone fingerIdentifier");
18 }
19
20 @end

Android手机

AndroidBaseDevice.h (假如Android手机有个特殊功能刷系统)

1 #import "BaseDevice.h"
2
3 @interface AndroidBaseDevice : BaseDevice
4
5 - (void)flashOS;
6
7 @end

AndroidBaseDevice.m

 1 #import "AndroidBaseDevice.h"
 2
 3 @implementation AndroidBaseDevice
 4
 5 - (void)makePhoneCall {
 6
 7     NSLog(@"Android makePhoneCall");
 8 }
 9
10 - (void)sendMessage {
11
12     NSLog(@"Android sendMessage");
13 }
14
15 - (void)flashOS {
16
17     NSLog(@"Android flashOS");
18 }
19
20 @end

Nokia手机

NokiaBaseDevice.h (假如Nokia手机一个特殊功能砸核桃)

1 #import "BaseDevice.h"
2
3 @interface NokiaBaseDevice : BaseDevice
4
5 - (void)knockNut;
6
7 @end

NokiaBaseDevice.m

 1 #import "NokiaBaseDevice.h"
 2
 3 @implementation NokiaBaseDevice
 4
 5 - (void)makePhoneCall {
 6
 7     NSLog(@"Nokia makePhoneCall");
 8 }
 9
10 - (void)sendMessage {
11
12     NSLog(@"Nokia sendMessage");
13 }
14
15 - (void)knockNut {
16
17     NSLog(@"Nokia knockNut");
18 }
19
20 @end

手机模型创建完了, 接着我们开始创建生产手机的工厂, 它有一个生产手机的方法

DeviceFactory.h

 1 #import <Foundation/Foundation.h>
 2 #import "iPhoneBaseDevice.h"
 3 #import "NokiaBaseDevice.h"
 4 #import "AndroidBaseDevice.h"
 5
 6 typedef enum : NSUInteger {
 7     kiPhone = 0x11,
 8     kAndroid,
 9     kNokia,
10 } EPhoneDevice;
11
12 @interface DeviceFactory : NSObject
13
14 /**
15  制造手机方法
16
17  @param type 手机类型
18  @return 手机实例
19  */
20 + (id <PhoneProtocol>)createPhoneWithDeviceType:(EPhoneDevice)type;
21
22 @end

DeviceFactory.m

 1 #import "DeviceFactory.h"
 2
 3 @implementation DeviceFactory
 4
 5 + (id <PhoneProtocol>)createPhoneWithDeviceType:(EPhoneDevice)type {
 6
 7     BaseDevice *device = nil;
 8     if (type == kiPhone) {
 9
10         device = [[iPhoneBaseDevice alloc] init];
11
12     } else if (type == kNokia) {
13
14         device = [[NokiaBaseDevice alloc] init];
15
16     } else if (type == kAndroid) {
17
18         device = [[AndroidBaseDevice alloc] init];
19
20     }
21
22     return device;
23 }
24
25 @end

好了, 现在是用户就是我们 也就是Controller可以开始定做手机了

 1 #import "ViewController.h"
 2 #import "DeviceFactory.h"
 3
 4 @interface ViewController ()
 5
 6 @end
 7
 8 @implementation ViewController
 9
10 - (void)viewDidLoad {
11
12     [super viewDidLoad];
13
14     //创建一个iPhone手机实例
15     iPhoneBaseDevice *phone = [DeviceFactory createPhoneWithDeviceType: kiPhone];
16
17     //打电话
18     [phone makePhoneCall];
19
20     //发短信
21     [phone sendMessage];
22
23     //指纹识别
24     [phone fingerIdentifier];
25
26 }
27
28
29
30 @end

最后说明, 简单工厂模式可以比较清晰便捷的实现同一模型对象的创建

但有一个弊端就是, 只能定制创建已经写好的对象, 比如上面这个工厂只能生成iPhone/Android/Nokia这三种手机,

如果你想再定制华为手机或者小米手机, 那就要工厂去建华为和小米的手机生产线, 所以这种情况我们就要增加模型对象并修改工厂方法了

时间: 2024-08-05 07:05:00

Objective-C 工厂模式(上) -- 简单工厂模式的相关文章

设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)

原文地址:http://blog.chinaunix.net/uid-25958655-id-4243289.html 简单工厂模式 当需要加法类的时候,调用工厂类的CreateOperate(),要指定制造的Product 例如在大话设计模式P11给的运算工厂例子: public static Operation createOperate(string operate) { Operation oper = null; 12 switch (operate) { case "+":

Java工厂模式(简单工厂、工厂方法、抽象工厂)

工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory Method).3:抽象工厂(Abstract Factory). 简单工厂(Simple Factory)又叫静态工厂,是工厂模式三中状态中结构最为简单的.主要有一个静态方法,用来接受参数,并根据参数来决定返回实现同一接口的不同类的实例.我们来看一个具体的例子:假设一家工厂,几生产洗衣机,有生产冰箱

策略模式与简单工厂模式

1,简单工厂模式 a) 有一个抽象的接口用来表示工厂需要生产的产品共性:然后各个具体的产品类实现该抽象接口. b) 工厂只需要持有产品的抽象接口,工厂接收一个 TYPE 参数来决定生产何种产品. c) 对于客户而言,当他需要某种类型的产品时,只需要获得工厂对象,然后将产品的 TYPE参数传递给工厂,由工厂创建他所需要的产品. 2,策略模式 策略,本质上是一种算法.当客户需要处理某件事情时,由于所处的环境不同,他可以采取不同的方式(策略)去处理.因此,客户关注的是如何方便得获取所需的策略. a)

java笔记--策略模式和简单工厂模式

策略模式: --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3884781.html "谢谢-- 为什么使用:策略模式主要用于有很多不同的方式来解决同一个问题的情景.如:文件的保存:可保存成txt,也可保存成xml.另外压缩文件.商场的促销策略等是类似的 如何使用:需要定义一个接口或者抽象类来表示各种策略的抽象,由于在选择适当的策略上有些不方便,需要不断地判断需要的类型,因此需要用简单工厂方法来实现判断过程 例子: 用策略模式实现图

策略模式结合简单工厂模式

概述 策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合. 场景 超市收营员收钱,有打几折.满多少返现.正常收费等活动来最终算出客户应该付多少现金. 1.现金收款超类 package com.gzy.designpattern.strategyandfactory; /* * @program: mybatis-plus * @description: 现金收款超类 * @aut

战略模式和简单工厂

策略算法级: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StrategyDemo { abstract class Strategy { public abstract void BillInterface(); } class ConcreteStrategyA : Strategy { public override void BillInte

java设计模式 -------- 创建模式 之 简单工厂模式

本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂模式是最常用的模式,因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a = new A(),工厂模式也是用来创建用来创建实例对象的,所以以后new时要多个心眼,是否可以考虑使用工厂模式. 简单工厂模式又可以分成三种模式: 1) 普通简单工厂模式 2) 多方法简单工厂模式 3) 多静态方法简单工厂模式 普通简单工厂模式: 举例:(简单的

设计模式笔记——策略模式VS简单工厂模式

策略模式VS简单工厂模式   策略模式(Strategy)它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 1.组成 -抽象策略角色: 策略类,通常由一个接口或者抽象类实现. -具体策略角色:包装了相关的算法和行为. -环境角色:持有一个策略类的引用,最终给客户端调用. 2.应用场景 - 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为. -需要在不同情况下使用不同的策略(算法),或者策略还可能在未来

工厂模式:简单工厂、工厂方法、抽象工厂

一.简介 工厂模式主要是为创建对象提供接口,让子类决定实例化哪个类.按照<Java与模式>可以分为: 1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式 二.简单工厂 适用于业务简单的情况:小项目或具体产品扩展很少的情况. 它由以下三种角色组成: 具体工厂类 抽象产品类 具体产品来 UML类图关系如下: 三.工厂方法 概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法将一个类的实例化延迟到其子类. 有以下角色组成: 抽象工厂类 具体工厂类 抽象产品类 具体产品类 UML类图