抽象工厂的灵活性要比简单工程的灵活性强。

抽象工厂的UML图(第一次画UML图,可能关系和箭头的图意义有错误,但是请不要以建模规范去看图,以最基本的结合后面OC代码,理解相关关系):

抽象工厂原理:
抽象工厂 较 简单工厂 多了抽象级别 而已。

因为需要创建抽象工厂,所以需要工厂管理器:
新建FactoryManager.h和FactoryManager.m:
FactoryManager.h:

 #import <Foundation/Foundation.h>
#import "BaseFactory.h"
#import "AppleFactory.h"
#import "GoogleFactory.h" 在抽象工厂类中为什么需要枚举列举工厂类,因为需要用户指定工厂,
然后让工厂来生产具体产品
typedef enum : NSUInteger { kApple = 0x11,
kGoogle, } EFactoryType; @interface FactoryManager : NSObject /**
* 获取工厂
*
* @param factoryType 工厂类型
*
* @return 创建出的工厂
*/
+ (BaseFactory *)factoryWithBrand:(EFactoryType)factoryType; @end

FactoryManager.h

FactoryManager.m:

 #import "FactoryManager.h"

 @implementation FactoryManager

 + (BaseFactory *)factoryWithBrand:(EFactoryType)factoryType {

     BaseFactory *factory = nil;

     if (factoryType == kApple) {

         factory = [[AppleFactory alloc] init];

     } else if (factoryType == kGoogle) {

         factory = [[GoogleFactory alloc] init];
} return factory;
} @end

FactoryManager.m

===============================================
建立具体工厂对应的父类工厂:
BaseFactory.h:

 #import <Foundation/Foundation.h>
#import "BasePhone.h"
#import "BaseWatch.h" @interface BaseFactory : NSObject /**
* 创建手机
*
* @return 手机
*/
- (BasePhone *)createPhone; /**
* 创建手表
*
* @return 手表
*/
- (BaseWatch *)createWatch; @end

BaseFactory.h

BaseFactory.m:

 #import "BaseFactory.h"

 @implementation BaseFactory

 - (BasePhone *)createPhone {

     return nil;
} - (BaseWatch *)createWatch { return nil;
} @end

BaseFactory.m

========================================================
关于继承的细节:
继承来自父类的方法,就不需要在子类的@interface声明中重写,直接在@implementation实现中实现父类的方法
========================================================
根据继承上面父类工厂新建两个具体工厂子类AppleFactory和GoogleFactory子类:
AppleFactory.h
#import "BaseFactory.h"

@interface AppleFactory : BaseFactory

@end
AppleFactory.m
#import "AppleFactory.h"
#import "iPhone.h"
#import "iWatch.h"

@implementation AppleFactory

- (BasePhone *)createPhone {
    
    return [[iPhone alloc] init];
}

- (BaseWatch *)createWatch {
    
    return [[iWatch alloc] init];
}

@end
=========================================================
GoogleFactory.m
#import "BaseFactory.h"

@interface GoogleFactory : BaseFactory

@end

GoogleFactory.h
#import "GoogleFactory.h"
#import "Android.h"
#import "AndroidWatch.h"

@implementation GoogleFactory

- (BasePhone *)createPhone {
    
    return [[Android alloc] init];
}

- (BaseWatch *)createWatch {
    
    return [[AndroidWatch alloc] init];
}

@end

=========================================================
手机也有抽象的父类
BasePhone.h:
#import <Foundation/Foundation.h>

@interface BasePhone : NSObject

@end
BasePhone.m:
#import "BasePhone.h"

@implementation BasePhone

@end

=========================================================
手机具体的子类
iPhone.h
#import "BasePhone.h"

@interface iPhone : BasePhone

@end

iPhone.m
#import "iPhone.h"

@implementation iPhone

@end

=========================================================
Android.h
#import "BasePhone.h"

@interface Android : BasePhone

@end
Android.m
#import "Android.h"

@implementation Android

@end

=========================================================
手表抽象的类
BaseWatch.h
#import <Foundation/Foundation.h>

@interface BaseWatch : NSObject

@end
BaseWatch.m
#import "BaseWatch.h"

@implementation BaseWatch

@end

=========================================================
手表具体的类
iWatch.h

 #import "iWatch.h"

 @implementation iWatch

 @end

iWatch.h

iWatch.m

 #import "BaseWatch.h"

 @interface AndroidWatch : BaseWatch

 @end

 #import "AndroidWatch.h"

 @implementation AndroidWatch

 @end

iWatch.m

=========================================================
客户端程序>>>>ViewController.m:

 #import "ViewController.h"
#import "FactoryManager.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // 获取工厂
BaseFactory *factory = [FactoryManager factoryWithBrand:kGoogle]; // 创建商品
BasePhone *phone = [factory createPhone];
BaseWatch *watch = [factory createWatch]; NSLog(@"%@ %@", phone, watch);
} @end

ViewController.m

 
 
 

IOS设计模式-抽象工厂的更多相关文章

  1. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  2. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. iOS 设计模式之工厂模式

    iOS 设计模式之工厂模式 分类: 设计模式2014-02-10 18:05 11020人阅读 评论(2) 收藏 举报 ios设计模式 工厂模式我的理解是:他就是为了创建对象的 创建对象的时候,我们一 ...

  4. linkin大话设计模式--抽象工厂

    linkin大话设计模式--抽象工厂 在前面讲到的简单工厂里面虽然实现了我们那个类和其中的依赖的解耦,但是在产生我们需要的依赖的那个工厂里面还是和具体的产品类耦合了  现在要是还想彻底解耦的话怎么办呢 ...

  5. 设计模式——抽象工厂(Abstract Factory)

    Abstract Factory 抽象工厂模式(创建型模式): new的问题:实现依赖,不能应变应对“具体实例化类型”的变化. 解决思路:--封装变化点:哪里变化,封装哪里           - - ...

  6. JAVA设计模式--抽象工厂模式

    抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...

  7. 深入浅出设计模式——抽象工厂模式(Abstract Factory)

    模式动机在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可 ...

  8. C#设计模式——抽象工厂

    一.引言 我相信看到这段文字的人,都具备了良好的技术功底.但是对于自己编写的代码总是充满抱怨,希望能够将自己编写的代码如同房子一般先进行有效 的设计,然后在进行建设.那么这篇文章能够给你一些思路,这里 ...

  9. 24种设计模式--抽象工厂模式【Abstract Factory Pattern】

    女娲造人,人是造出来了,世界是热闹了,可是低头一看,都是清一色的类型,缺少关爱.仇恨.喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋,忘记给人类定义性别了,那怎么办?抹掉重来,然后就把人类 ...

随机推荐

  1. Java 集合系列09之 Map架构

    概要 前面,我们已经系统的对List进行了学习.接下来,我们先学习Map,然后再学习Set:因为Set的实现类都是基于Map来实现的(如,HashSet是通过HashMap实现的,TreeSet是通过 ...

  2. jackson反序列化时忽略不需要的字段

    有时候,如果数据库表中增加一个字段,但返回的JSON字符串中含有我们并不需要的字段,那么当对应的实体类中不含有该字段时,会抛出一个异常,告诉你有些字段没有在实体类中找到.解决办法很简单,在声明Obje ...

  3. c# XML序列化与反序列化

    c# XML序列化与反序列化 原先一直用BinaryFormatter来序列化挺好,可是最近发现在WinCE下是没有办法进行BinaryFormatter操作,很不爽,只能改成了BinaryWrite ...

  4. 【iOS】FMDB/SQLCipher数据库加解密,迁移

    2016-04-19更新:本文代码可能有些问题,请移步 http://zhengbomo.github.io/2016-04-18/sqlcipher-start/ 查看 sqlite应用几乎在所有的 ...

  5. [CLR via C#]10. 属性

    一.无参属性 对于字段,强烈建议将所有的字段都设为private.如果允许用户或类型获取或设置状态信息,就公开一个针对该用途的方法.封装了字段访问的方法通常称为访问器(accessor)方法.访问器方 ...

  6. JS获取屏幕高度

    主要使用了document对象关于窗口的一些属性,这些属性的主要功能和用法如下. 要 得到窗口的尺寸,对于不同的浏览器,需要使用不同的属性和方法:若要检测窗口的真实尺寸,在netscape下需要使用w ...

  7. .NET转JAVA之拼音组件

    PS:做了4年,自我感觉.NET到瓶颈了,而且公司并没有深入运用.NET技术的项目,自我学习感觉也没太大动力(请骂我懒T_T).再加上技术年限越往上走,了解到的.NET职业提升环境就越来越艰难(个人理 ...

  8. [转载]Ubuntu14.04 LTS更新源

    不同的网络状况连接以下源的速度不同, 建议在添加前手动验证以下源的连接速度(ping下就行),选择最快的源可以节省大批下载时间. 首先备份源列表: sudo cp /etc/apt/sources.l ...

  9. Mongoose 框架初学使用记录

    嘛.... 最近由于需要使用HTTP服务端,原先是使用的Qt框架实现的HTTP服务端,然后发现有些缺陷导致我不得不放弃这个框架,也不是完全放弃,只是HTTP服务端这里不再使用Qt,用Qt做高并发真的有 ...

  10. JavaSE——TCP网络编程(二)

    ServerSocket 类与Socket 类的不同用法: ServerSocket类: 创建一个ServerSocket类,同时在运行该语句的计算机的指定端口处建立一个监听服务,如:    Serv ...