Objective-C 工厂模式(下) -- 抽象工厂模式
相比简单工厂模式, 只有一个工厂 能生产的手机也是固定的
抽象工厂模式类似于有很多家工厂, 当用户要买什么手机就创建对应的工厂去生产
比如用户要买iPhone就创建一个Apple工厂来生产手机, 要买Android手机就创建一个Goolge工厂
这样创建工厂, 工厂, 用户这样就是我们要考虑的因素 (其实还有手机, 这里就跳过不讲了跟简单工厂模式里面一样)
创建工厂要有一个管理对象, 来根据客户的需求自动创建相应的工厂
工厂只要负责生产手机就好了
现在来构建代码
先写一个基本工厂模型
BaseFactory.h
#import <Foundation/Foundation.h> @interface BaseFactory : NSObject /**
创建手机方法 @return 返回手机对象
*/
- (id)createPhone; @end
BaseFactory.m
#import "BaseFactory.h" @implementation BaseFactory - (id)createPhone { //可以再添加代码禁止BaseFactory直接调用此方法
//只允许子类调用
return nil;
} @end
来创建Apple工厂
AppleFactory.h
#import "BaseFactory.h" @interface AppleFactory : BaseFactory @end
AppleFactory.m
#import "AppleFactory.h" @implementation AppleFactory - (id)createPhone { NSLog(@"创建Apple手机");
//这里应该是再给给工程添加手机模型, 创建并返回手机对象
//现在只是举例 先不实现这部分
return nil;
} @end
创建Google工厂
GoogleFactory.h
#import "BaseFactory.h" @interface GoogleFactory : BaseFactory @end
GoogleFactory.m
#import "GoogleFactory.h" @implementation GoogleFactory - (id)createPhone { NSLog(@"创建Google手机");
//这里应该是再给给工程添加手机模型, 创建并返回手机对象
//现在只是举例 先不实现这部分
return nil;
} @end
下面是工厂管理者
FactoryManager.h负责根据用户需求创建工厂去生产
#import <Foundation/Foundation.h>
#import "AppleFactory.h"
#import "GoogleFactory.h" typedef enum : NSUInteger {
kApple = 0x1,
kGoogle,
} EFactoryType; @interface FactoryManager : NSObject /**
创建手机工厂 @param type 工厂类别
@return 返回工厂对象
*/
+ (id)createFactoryWithType:(EFactoryType)type; @end
FactoryManager.m
#import "FactoryManager.h" @implementation FactoryManager + (id)createFactoryWithType:(EFactoryType)type { BaseFactory *factory;
if (type == kApple) { factory = [[AppleFactory alloc] init]; } else if (type == kGoogle) { factory = [[GoogleFactory alloc] init]; } return factory;
} @end
下面是实现
#import "ViewController.h"
#import "FactoryManager.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //创建工厂
AppleFactory *factory = [FactoryManager createFactoryWithType:kApple]; //工厂生产手机
[factory createPhone]; } @end
抽象工厂模式比简单工厂模式更加灵活
Objective-C 工厂模式(下) -- 抽象工厂模式的更多相关文章
- 设计模式之工厂模式VS抽象工厂
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...
- 工厂模式[3] 抽象工厂 Abstract Factory
简介 1.简单工厂,或静态工厂,产品接口 定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类或实现同一接口 优点:客户端可以直接消费产品,而不必关心具体产品的实现(不关心对象的 ...
- Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
- c#工厂模式与抽象工厂模式
一. 工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中. 工厂方法模式是简单工 ...
- 设计模式(Python)-简单工厂,工厂方法和抽象工厂模式
本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...
- [19/04/23-星期二] GOF23_创建型模式(工厂模式、抽象工厂模式)
一.工厂模式(分为:简单工厂模式.工厂方法模式.抽象工厂模式) 实现了创建者和调用者的分离 核心本质:1.实例化对象,用工厂方法代替new操作:2.将选择实现类.创建对象统一管理和控制,从而将调用者跟 ...
- 设计模式3---工厂模式(Factory Pattern简单工厂、工厂方法、抽象工厂)
工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...
- Java设计模式(3)——创建型模式之抽象工厂模式(Abstract Factory)
一.概述 抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象. UML图: 其他的过多概念不再 ...
- java设计模式 -------- 创建模式 之 抽象工厂模式
本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂方法模式和抽象工厂模式不好区分清楚: 工厂方法模式特点: 1. 一个抽象产品 ...
随机推荐
- [spring源码学习]六、IOC源码-BeanFactory和factory-bean
一.代码实例 在我们分析spring的IOC源码的时候,发现除了配置标准的bean,并且通过getBean(beanName)的方法获取到一个bean的实例外,似乎还有这不少其他获取的方法,例如在第四 ...
- java的动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- Spring MVC --->>>No mapping found for HTTP request with URI
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> < ...
- Java数据结构——栈的应用(以数制转换为例子)
看一万遍,不如自己动手实践,请不要直接copy代码,先自己去理解例子实现的原理,然后试着自己动手去实践. 用Java去实现栈操作,会用到stack这个类,这类中有几个方法需要知道他们的用法 bool ...
- 如何发布付费WP8应用
如何发布付费应用,听起来蛮简单的,事实上也确实如此,但是发布付费WP8应用前的资料填写却让我郁闷不已. 我打开仪表板,点击进入账户--账户摘要,填写税务资料和付款账户,发现付款账户保存成功了,税务资料 ...
- content相关属性
content属性值 : width:可视区域的宽度,值可为数字或关键词device-width height:同width intial-scale:页面首次被显示是可 ...
- 使用nose 进行Python项目的自动化测试
一.为什么使用nose? 编写测试更容易.nose可以自动识别继承于unittest.TestCase的测试单元,并执行测试,而且,nose也可以测试非继承于unittest.TestCase的测试单 ...
- JavaScript解惑记之Array.prototype.sort()
前言 看JS红宝书的5.2.5章节关于sort()方法,如何用一个compare函数,让数组顺序,倒序,有点云里雾里的.在网上度娘了一下,发现更迷糊了.走投无路的情况下,只能发动神技能,去 stack ...
- AFNetWorking设置HTTPRequestHeaders的坑
今天在项目中要封装一个请求头但是用如下方法总是失败: 求其原因不知道: 于是乎改用了属性对象后居然成功了..: // // RequestManager.m // 获取天气demo // // ...
- USER STORIES AND USE CASES - DON’T USE BOTH
We’re in Orlando for a working session as part of the Core Team building BABOK V3 and over dinner th ...