相比简单工厂模式, 只有一个工厂 能生产的手机也是固定的

抽象工厂模式类似于有很多家工厂, 当用户要买什么手机就创建对应的工厂去生产

比如用户要买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 工厂模式(下) -- 抽象工厂模式的更多相关文章

  1. 设计模式之工厂模式VS抽象工厂

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...

  2. 工厂模式[3] 抽象工厂 Abstract Factory

    简介 1.简单工厂,或静态工厂,产品接口 定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类或实现同一接口 优点:客户端可以直接消费产品,而不必关心具体产品的实现(不关心对象的 ...

  3. Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

  4. c#工厂模式与抽象工厂模式

    一. 工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中. 工厂方法模式是简单工 ...

  5. 设计模式(Python)-简单工厂,工厂方法和抽象工厂模式

    本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...

  6. [19/04/23-星期二] GOF23_创建型模式(工厂模式、抽象工厂模式)

    一.工厂模式(分为:简单工厂模式.工厂方法模式.抽象工厂模式) 实现了创建者和调用者的分离 核心本质:1.实例化对象,用工厂方法代替new操作:2.将选择实现类.创建对象统一管理和控制,从而将调用者跟 ...

  7. 设计模式3---工厂模式(Factory Pattern简单工厂、工厂方法、抽象工厂)

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

  8. Java设计模式(3)——创建型模式之抽象工厂模式(Abstract Factory)

    一.概述 抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象. UML图: 其他的过多概念不再 ...

  9. java设计模式 -------- 创建模式 之 抽象工厂模式

    本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020 工厂方法模式和抽象工厂模式不好区分清楚: 工厂方法模式特点: 1. 一个抽象产品 ...

随机推荐

  1. BZOJ 1176 [Balkan2007]Mokia ——CDQ分治

    [题目分析] 同BZOJ2683,只需要提前处理s对结果的影响即可. CDQ的思路还是很清晰的. 排序解决一维, 分治时间, 树状数组解决一维. 复杂度是两个log [代码] #include < ...

  2. 多线程之互斥锁(By C++)

    首先贴一段win32API实现的多线程的代码,使用CreateThread实现,如果不要传参数,就把第四个参数设为NULL #include<Windows.h> #include< ...

  3. 转:Delphi 函数大全

    Delphi 函数大全 - xiucaiyao的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/xiucaiyao/article/details/4544039 名 ...

  4. spark shuffle 相关细节整理

    1.Shuffle Write 和Shuffle Read具体发生在哪里 2.哪里用到了Partitioner 3.何为mapSideCombine 4.何时进行排序 之前已经看过spark shuf ...

  5. ASP.NET中获取Repeater模板列中LinkButton按钮事件中获取ID等

    前台页面中: <asp:Repeater ID="repComment" runat="server">            <ItemTe ...

  6. javax.mail 发送邮件异常

    一.运行过程抛出异常 1.Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/mail/util/ ...

  7. Master-Slave通用基础框架

    一.设计目的 设计出一个通用的Master-Slave基础框架,然后可以基于这个框架来实现特定的业务需求,比如实现多节点并行计算.分布式处理等. 二.设计理念 基于经典的命令模式,Master和Sla ...

  8. 设置Flush刷新模式setFlushMode()

    参考 http://blog.csdn.net/superdog007/article/details/38852399 FlushMode的枚举值: FlushMode.ALWAYS:任务一条SQL ...

  9. [Android] 多重使用Fragment 中的onFragmentInteraction

    新建的一个Fragment,被一个Activity使用,那么这个Activity需要继承一个接口: public class MainActivity extends Activity impleme ...

  10. Python之路【第六篇】python基础 之面向对象进阶

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象  和  issubclass(su ...