iOS设计模式——工厂模式

何为工厂方法模式?

工厂方法也称为虚构造器,它适用于这种情况:一个类无法预期需要生成哪个类的对象,想让其子类来指定所生成的对象。

工厂方法模式:定义创建对象的接口,让子类决定实例化哪一个类。工厂方法使得一个类的实例化延迟到其子类。

何时使用工厂方法

@:编译时无法准确预期要创建的对象的类。

@:类想让子类决定运行时创建什么。

@:类有若干辅助类为其子类,而你想要将返回哪个子类这一信息局部化。

使用这一模式的最低限度是,工厂方法能给予类在变更返回哪一种对象这一点上更多的灵活性。

与直接创建新的具体对象相比,使用工厂方法创建对象可算作一种最佳做法。工厂方法模式让客户程序可以要求由工厂方法创建的对象拥有一组共同的行为。所以往类层次结构中引入新的具体产品并不需要修改客户端代码。因为返回的任何具体对象的接口都跟客户端一直在用的接口相同。

在Cocoa Touch框架中应用工厂方法

比如NSNumber有很多numberWith*方法;其中有两个是numberWithBool:和numberWithChar:。它们是类方法,也就是说我们向NSNumber发送[NSNumber numberWithBool:bool]与[NSNumber numberWithChar:char],以获得与传入参数同类型的各种NSNumber实例。与如何创建NSNumber的具体子类的实例有关的所有细节,都由NSNumber的类工厂方法负责。[NSNumber numberWithBool:bool]的情况是,方法接受值bool,并把NSNumber的内部子类的一个实例初始化,让它能够反映传入的值bool。

工厂方法的应用

我们通过一个协议让工厂对象具有相同的方法,在协议里面我们声明一个计算的方法,用来做两个数的计算,代码如下:

#import <Foundation/Foundation.h>

@protocol Calculate <NSObject>

@property (nonatomic, assign) float numberA;
@property (nonatomic, assign) float numberB;

- (float)calculate;

@end

然后我们定义两个类来具体的计算,分别是求和计算与相乘计算,代码如下:

#import <Foundation/Foundation.h>
#import "Calculate.h"
@interface AddCalculate : NSObject <Calculate>

- (float)calculate; //重写该方法

@end
#import "AddCalculate.h"

@implementation AddCalculate
@synthesize numberA = _numberA;
@synthesize numberB = _numberB;

- (float)calculate {
    return self.numberA + self.numberB;
}

@end
#import <Foundation/Foundation.h>
#import "Calculate.h"
@interface MultiplyCalculate : NSObject <Calculate>

- (float)calculate; 

@end
#import "MultiplyCalculate.h"

@implementation MultiplyCalculate
@synthesize numberA = _numberA;
@synthesize numberB = _numberB;
- (float)calculate {
    return self.numberA*self.numberB;
}

@end

这样具体的计算已经由这两个类来进行实现了,下面我们来创建相应的工厂方法,首先我们创建一个抽象的工厂类,Factory代码如下:

#import <Foundation/Foundation.h>
#import "Calculate.h"
@interface Factory : NSObject <Calculate>

- (id)createFactory;

@end
#import "Factory.h"

@implementation Factory
@synthesize numberA = _numberA;
@synthesize numberB = _numberB;

- (id)createFactory {
    NSLog(@"具体返回什么对象,由子类来决定");
    return nil;
}

- (float)calculate {
    return -1; //默认返回-1
}

@end

从代码中我们可以看到,抽象的Factory定义了工厂方法创建的对象的接口。但具体返回什么对象要由其子类来进行确定,AddFactory类的代码如下:

#import "Factory.h"

@interface AddFactory : Factory

- (id)createFactory; //重写该方法

@end
#import "AddFactory.h"
#import "AddCalculate.h"
@implementation AddFactory

- (id)createFactory {
    return [[AddCalculate alloc] init];
}

@end

MultiplyFactory代码如下:

#import "Factory.h"

@interface MultiplyFactory : Factory

- (id)createFactory; 

@end
#import "MultiplyFactory.h"
#import "MultiplyCalculate.h"
@implementation MultiplyFactory

- (id)createFactory {
    return [[MultiplyCalculate alloc] init];
}

@end

从代码中我们可以看到,AddFactory与MultiplyFactory实现了createFactory接口,定义了返回对象的工厂方法。下面我们看下在客户端怎么使用工厂模式,客户端代码如下:

#import "ViewController.h"
#import "Calculate.h"
#import "AddCalculate.h"
#import "MultiplyCalculate.h"
#import "Factory.h"
#import "AddFactory.h"
#import "MultiplyFactory.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    Factory *factory = [[AddFactory alloc] init];
    Factory *calculate = [factory createFactory];
    calculate.numberA = 10.0;
    calculate.numberB = 20.0;
    
    float sum =  [calculate calculate];
    NSLog(@"sum is = %f", sum);
    
    Factory *factory1 = [[MultiplyFactory alloc] init];
    Factory *calculate1 = [factory1 createFactory];
    calculate1.numberA = 10.0;
    calculate1.numberB = 20.0;
    
    float multiply =  [calculate1 calculate];
    NSLog(@"sum is = %f", multiply);
    
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

输出端如下:

2015-09-04 22:51:06.298 FactoryPattern[49484:2688173] sum is = 30.000000
2015-09-04 22:51:06.299 FactoryPattern[49484:2688173] multiply is = 200.000000

从这个例子我们可以看出,工厂方法从代码中消除了对应用程序特有类的耦合。代码只需要处理Factory抽象接口,所以同一代码得以复用,在应用程序中与用户定义的任何具体类一起工作。

demo链接地址:https://github.com/guoshimeihua/FactoryPattern.git

时间: 2024-10-24 02:23:22

iOS设计模式——工厂模式的相关文章

6.大话设计模式-工厂模式

工厂模式和简单工厂有什么区别.废话不多说,对比第一篇例子应该很清楚能看出来. 优点: 工厂模式弥补了简单工厂模式中违背开放-封闭原则,又保持了封装对象创建过程的优点. using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace DesignModel{    public interface Factory   

设计模式---工厂模式---生产水果

设计模式---工厂模式 需要一个基本的抽象类:相当一个基本的工厂 需要若干个具体类:相当若干个产品 需要工具类:相当工厂中机器,用来选择不同的产品生产 需要主类:相当顾客所想的订单 主类 ----> 工厂类 ----> 产品类 ---> 产品具体类 老板根据顾客的订单,在工具堆中选择合适的,然后去工厂中生产适合的产品,返回给顾客 优势:能够在不修改原先的代码情况,增加所需的类与方法. 不足:会增多类文件的数量 接口:提供的内容,相当于协议,即外界使用此接口时,接口的内容是不允许外界对接口

设计模式——工厂模式学习

1.概念 工厂模式定义:实例化对象,用工厂方法代替new操作.达到解耦的目的(避免硬编码耦合).工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式. 工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见.因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例

二十三种设计模式——工厂模式

二十三种设计模式--工厂模式 简单工厂模式 简单工厂模式又称静态工厂方法(StaticFactory Method)模式,不属于23种模式之一. 简单工厂模式是工厂模式最简单使用的模式. 类图: 程序: #include <iostream> #include<string> using namespace std; class NationalFlag//父类 { public: NationalFlag(){} ~NationalFlag(){} virtual void di

设计模式-工厂模式[Factory]

先看下一个简单的实现: 1 package org.masque.designpatterns.factorymethod.one; 2 /** 3 * 4 * Description: Sample子类的标示 5 * BeanEm.java Create on 2014年7月11日 下午2:37:58 6 * @author [email protected] 7 * @version 1.0 8 * Copyright (c) 2014 Company,Inc. All Rights Res

5分钟读书笔记之 - 设计模式 - 工厂模式

一个类或者对象中,往往会包含别的对象.在创建这种对象的时候,你可能习惯于使用常规方式,即用 new 关键字和类构造函数. 这会导致相关的俩个类之间产生依赖. 工厂模式,就是消除这俩个类之间的依赖性的一种模式,它使用一种方法来决定究竟实例化那个具体的类. 简单工厂模式 假设你想开几个自行车商店,每个商店都有几种型号的自行车出售,可以用这样一个类来表示: var BicycleShop = function(){} BicycleShop.prototype = { sellBicycle:func

iOS设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

1. 简单工厂模式 如何理解简单工厂,工厂方法, 抽象工厂三种设计模式? 简单工厂的生活场景,卖早点的小摊贩,他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂,它生产包子,馒头,地沟油烙的煎饼.该场景对应的UML图如下所示: 图1:简单工厂模式UML图 简单工厂模式的参与者: 工厂(Factory)角色:接受客户端的请求,通过请求负责创建相应的产品对象. 抽象产品(Abstract Product)角色: 是工厂模式所创建对象的父类或是共同拥有的接口.可是抽象类或接口. 具体产品(Conc

java设计模式--工厂模式

总结 (1)简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的. (2)工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成. (3)抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类.它针对的是有多个产品的等级结构.而工厂方法模式针对的是一个产品的等级结构. 一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java

iOS设计模式——生成器模式

选择建造自己的房子的人会把工程外包给承包商.单一承包商不能建造整个房子,他将其分解为几个部分,然后转包给几个实际的建筑商,他们懂得如何将零部件组装起来.房子由由风格.颜色和尺寸各不相同的部件组成.客户告诉承包商房子里都要有什么,然后承包商协调各房屋建筑商,决定需要做什么.应该如何建造,建筑商就如何施工.建房子是个复杂过程,单凭一双手就想建房子,即便可能也非常困难.如果承包商(指导者)与懂得如何建造的建筑商相互协调,这一过程简单得多且更易管理. 有时,构建某些对象有多种不同方式.如果这些逻辑包含在