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

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

比如用户要买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. Service and controller in angularJs

    Separation of concern is at the heart while designing an AngularJS application. Your controller must ...

  2. mybatis map常用数据类型

    JDBC Type Java Type CHAR String VARCHAR String LONGVARCHAR String NUMERIC java.math.BigDecimal DECIM ...

  3. FileStream

    允许其他进程只读打开 New FileStream("路徑", FileMode.Append, FileAccess.Write, FileShare.Read) 允许其他进程以 ...

  4. cocoapods导入shareSDK分享实现

    这个在官方文档没有说这两个库是必须导入的,但是不导入是会有错误的 pod 'ShareSDK3/ShareSDKConfigurationFile' pod 'ShareSDK3/ShareSDKEx ...

  5. 使用VisualVM检测

    下载 https://visualvm.github.io/ 检测远程服务器 转自:http://blog.csdn.net/yangkangtq/article/details/52277794 授 ...

  6. 批量设置select为默认项

    app.$form.find("select").prop("selectedIndex", 0);

  7. oracle 和c3p0 数据库的Time_Wait 过多问题的一个解决方案。

    项目是B/S模式,放在linux服务器上,tomcat和oracle11g在一台服务器上,tomcat读取数据库采用C3P0连接池,一直比较稳定,所以也没有去管.后来把tomcat放在一台win200 ...

  8. Salesforce注册开发者账号

    在对Salesforce进行了简单的了解之后,我们现在来注册Salesforce的开发者账号,开始Salesforce的学习 一.注册前的准备 首先点击网址:https://developer.sal ...

  9. ceil 模块

    # 有时需要得到一个最小的整数,而这个数只能比自己大或相等,不能小于自己 #如: 2.1 我们需要得到的最小整数为3,即使后一位只有很小的一部分,一般用于分页 from math import cei ...

  10. 一键保存Feedly里的文章到有道笔记

    写在之前:今天升级了有道笔记3.5,发现有道笔记支持发邮件保存笔记了,所以就分享一下怎么通过IFTTT保存到有道笔记.因为IFTTT是外国货,所以一直没有有道笔记的频道,不过有了发邮件保存笔记的功能, ...