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. 一个抽象产品 ...
随机推荐
- filefiter
1.写一个类继承与FileFilter package com.dream.musicplayer; import <a href="http://lib.csdn.net/base/ ...
- 無間道III 終極無間
凭良心说,它绝对算是诚意之作,而非急功近利或者说抢市.因为导演尤其是编剧都用了心,为了和第一二集融合而在细节处理上做足了文章,麦兆辉也实在够天才. 关于时间问题,本片不是完全杂乱无章,只不过是前后两段 ...
- Backbone,Marionette,Talent学习笔记
具体以源码为准 Talent继承自Marionette继承自BackBone Region: 继承自Backbone.Event,show(view)会调用view.render(),然后$el.ap ...
- 20161023 NOIP 模拟赛 T2 解题报告
Task 2.回文串计数 (calc.pas/calc.c/calc.cpp) [题目描述] 虽然是一名理科生,Mcx常常声称自己是一名真正的文科生.不知为何,他对于背诵总有一种莫名的热爱,这也促使他 ...
- bzoj1026数位dp
基础的数位dp 但是ce了一发,(abs难道不是cmath里的吗?改成bits/stdc++.h就过了) #include <bits/stdc++.h> using namespace ...
- 文本选择问题: css & js
CSS: /*Disable browser selection*/ .disableselect { -webkit-user-select: none; -moz-user-select: non ...
- WPF-禁止二次启动
App.xaml.cs protected override void OnStartup(StartupEventArgs e) { //禁止二次启动 this.Startup += new Sta ...
- Docker 创建php 开发环境遇到的权限问题解决方案
最近我将公司的开发,和测试环境都运行到docker 上面,因为开发,测试基本都是装代码拉到本址,然后,再装目录,挂载到镜像目录中如:我用的是docker-compose # development.y ...
- Sql判断不为Null也不为空的写法
看到不少人写: isnull(field,'')<>'' 其中这样写最经济实惠:field>''
- Java 8 forEach简单例子
1. forEach and Map 1.1 通常这样遍历一个Map Map<String, Integer> items = new HashMap<>(); items.p ...