使用Object-C实现23种设计模式之工厂方法模式
2016-05-19 11:50
513 查看
以前的时候,做的是Android,习惯了Java的风格,刚一接触OC,稍稍有些不适应,所以作为一个OC刚入门的新手,在此结合一下以前的Java经验以及对算法的运用,将23种设计模式通过OC进行实现。
关于什么是设计模式,以及运用设计模式有什么好处,就不再细说了,相比大多数看到此贴的人,都已经充分了解了设计模式,至少应该了解了什么是设计模式以及为什么使用设计模式。
话不多说,下面就是对设计模式当中最简单也最常用的一种——工厂方法模式的OC实现。
工厂方法模式,可以简单理解为一个生产公司生产同品牌多型号的产品,其中产品A在车间A进行生产,产品B在车间B进行生产……譬如,某电子科技公司,生产电脑、手机两种产品,在该公司内有电脑生产车间以及手机生产车间,分别生产电脑以及手机,电脑车间的变动对手机的生产不会产生任何影响,同样的手机车间的变动也不会对电脑的生产产生任何影响。
下面便是对以上示例的实现:
首先,先不用去确定这是一个生产什么的公司,只需要明确他是一个生产制造型的公司即可,其中,必不可少的两个因素:生产车间以及产品,故此,先写出两个协议(即借口,一下统称为协议),分别为Factory协议以及Product协议,同时在这两个协议里边声明(不实现)其所必需的方法。
Product协议的实现:
#import
<Foundation/Foundation.h>
@protocol Product <NSObject>
@required
-(void)introduce;
-(void)function;
@end
Factory协议的实现:
#import <Foundation/Foundation.h>
#import "Product.h"
@protocol Factory <NSObject>
@required
-(NSObject<Product>*)createProduct;
@end
先把车间以及产品这个大类声明之后,然后再去了解,这是一个生产什么产品的公司,去了解公司的所有产品:
Computer类:
Computer.h
#import<Foundation/Foundation.h>
#import
"Product.h"
@interface Computer :NSObject<Product>
@end
Computer.m
#import "Computer.h"
@implementation Computer
-(void)introduce{
NSLog(@"I am computer!");
}
-(void)function{
NSLog(@"I can program!");
}
@end
Phone类:
Phone.h
#import <Foundation/Foundation.h>
#import "Product.h"
@interface Phone :
NSObject<Product>
@end
Phone.m
#import "Phone.h"
@implementation Phone
-(void)introduce{
NSLog(@"I am phone!");
}
-(void)function{
NSLog(@"I can make a phone call!");
}
@end
现在已经明确了公司需要生产什么产品了,那么只需要根据相应的产品来划分生产车间即可。
电脑车间ComputerFactory类
ComputerFactory.h
#import <Foundation/Foundation.h>
#import "Factory.h"
@interface ComputerFactory :
NSObject<Factory>
@end
ComputerFactory.m
#import "ComputerFactory.h"
#import "Computer.h"
@implementation ComputerFactory
-(NSObject<Product>*)createProduct{
return [Computeralloc];
}
@end
手机车间PhoneFactory类
PhoneFactory.h
#import <Foundation/Foundation.h>
#import "Factory.h"
@interface PhoneFactory :
NSObject<Factory>
@end
PhoneFactory.m
#import "PhoneFactory.h"
#import "Phone.h"
@implementation PhoneFactory
-(NSObject<Product>*)createProduct{
return [Phonealloc];
}
@end
程序写到这里,公司已经算是万事俱备只欠开工了,只要老板一声令下,公司就可以正常运作起来,并且老板不用费吹灰之力,也不用亲自到车间去观看具体的生产流程,车间内部的粗活累活对公司老板完全透明。
#import <Foundation/Foundation.h>
#import "Product.h"
#import "ComputerFactory.h"
#import "PhoneFactory.h"
int main(int argc,constchar * argv[]) {
@autoreleasepool {
NSObject<Product>* pro1 = [[ComputerFactoryalloc]createProduct];//老板说:生产一台电脑
[pro1 introduce];
[pro1 function];
NSObject<Product>* pro2 = [[PhoneFactoryalloc]createProduct];//老板说:生产一部手机
[pro2 introduce];
[pro2 function];
}
return 0;
}
公司在这种条例有序的工作模式下,很快取得了巨大的收益,仅仅生产电脑、手机两种产品已经不能够满足老板赚钱的欲望,经过公司董事会的一致商议,决定公司要添加电子手表以及数码相机两种产品。
在这种模式下,无需更改任何已存在的产品以及车间,只需要增加Watch类(Watch产品)和Camera类(Camera产品),以及相对应得WatchFactory(Watch车间)和CameraFactory(Camera车间)即可。
以上是我个人对工厂方法模式的简单理解,如有不到之处,敬请各位补充。
未完待续。。。
关于什么是设计模式,以及运用设计模式有什么好处,就不再细说了,相比大多数看到此贴的人,都已经充分了解了设计模式,至少应该了解了什么是设计模式以及为什么使用设计模式。
话不多说,下面就是对设计模式当中最简单也最常用的一种——工厂方法模式的OC实现。
工厂方法模式,可以简单理解为一个生产公司生产同品牌多型号的产品,其中产品A在车间A进行生产,产品B在车间B进行生产……譬如,某电子科技公司,生产电脑、手机两种产品,在该公司内有电脑生产车间以及手机生产车间,分别生产电脑以及手机,电脑车间的变动对手机的生产不会产生任何影响,同样的手机车间的变动也不会对电脑的生产产生任何影响。
下面便是对以上示例的实现:
首先,先不用去确定这是一个生产什么的公司,只需要明确他是一个生产制造型的公司即可,其中,必不可少的两个因素:生产车间以及产品,故此,先写出两个协议(即借口,一下统称为协议),分别为Factory协议以及Product协议,同时在这两个协议里边声明(不实现)其所必需的方法。
Product协议的实现:
#import
<Foundation/Foundation.h>
@protocol Product <NSObject>
@required
-(void)introduce;
-(void)function;
@end
Factory协议的实现:
#import <Foundation/Foundation.h>
#import "Product.h"
@protocol Factory <NSObject>
@required
-(NSObject<Product>*)createProduct;
@end
先把车间以及产品这个大类声明之后,然后再去了解,这是一个生产什么产品的公司,去了解公司的所有产品:
Computer类:
Computer.h
#import<Foundation/Foundation.h>
#import
"Product.h"
@interface Computer :NSObject<Product>
@end
Computer.m
#import "Computer.h"
@implementation Computer
-(void)introduce{
NSLog(@"I am computer!");
}
-(void)function{
NSLog(@"I can program!");
}
@end
Phone类:
Phone.h
#import <Foundation/Foundation.h>
#import "Product.h"
@interface Phone :
NSObject<Product>
@end
Phone.m
#import "Phone.h"
@implementation Phone
-(void)introduce{
NSLog(@"I am phone!");
}
-(void)function{
NSLog(@"I can make a phone call!");
}
@end
现在已经明确了公司需要生产什么产品了,那么只需要根据相应的产品来划分生产车间即可。
电脑车间ComputerFactory类
ComputerFactory.h
#import <Foundation/Foundation.h>
#import "Factory.h"
@interface ComputerFactory :
NSObject<Factory>
@end
ComputerFactory.m
#import "ComputerFactory.h"
#import "Computer.h"
@implementation ComputerFactory
-(NSObject<Product>*)createProduct{
return [Computeralloc];
}
@end
手机车间PhoneFactory类
PhoneFactory.h
#import <Foundation/Foundation.h>
#import "Factory.h"
@interface PhoneFactory :
NSObject<Factory>
@end
PhoneFactory.m
#import "PhoneFactory.h"
#import "Phone.h"
@implementation PhoneFactory
-(NSObject<Product>*)createProduct{
return [Phonealloc];
}
@end
程序写到这里,公司已经算是万事俱备只欠开工了,只要老板一声令下,公司就可以正常运作起来,并且老板不用费吹灰之力,也不用亲自到车间去观看具体的生产流程,车间内部的粗活累活对公司老板完全透明。
#import <Foundation/Foundation.h>
#import "Product.h"
#import "ComputerFactory.h"
#import "PhoneFactory.h"
int main(int argc,constchar * argv[]) {
@autoreleasepool {
NSObject<Product>* pro1 = [[ComputerFactoryalloc]createProduct];//老板说:生产一台电脑
[pro1 introduce];
[pro1 function];
NSObject<Product>* pro2 = [[PhoneFactoryalloc]createProduct];//老板说:生产一部手机
[pro2 introduce];
[pro2 function];
}
return 0;
}
公司在这种条例有序的工作模式下,很快取得了巨大的收益,仅仅生产电脑、手机两种产品已经不能够满足老板赚钱的欲望,经过公司董事会的一致商议,决定公司要添加电子手表以及数码相机两种产品。
在这种模式下,无需更改任何已存在的产品以及车间,只需要增加Watch类(Watch产品)和Camera类(Camera产品),以及相对应得WatchFactory(Watch车间)和CameraFactory(Camera车间)即可。
以上是我个人对工厂方法模式的简单理解,如有不到之处,敬请各位补充。
未完待续。。。
相关文章推荐
- android activity之间传递ArrayList<HashMap<String,Object>>
- csharp: .NET Object Relationional Mapper (ORM)- SubSonic
- 论文阅读:Volumetric and Multi-View CNNs for Object Classification on 3D Data
- 设计模式之对象池模式(Object Pool)
- SAP Business One 对象类型大全 (Object Type)
- Jquery中(function($){...})(jQuery),$(function(){}),$.extend(object)和$.fn.extend(object)
- iOS中Objective-C与JavaScript之间相互调用的实现(实现了与Android相同的机制)
- ObjectAnimator实现机制_源码分析
- Objective-C语法汇总
- Exploring Python Code Objects
- Java之Object类详解
- Python integer objects implementation
- 错误解决:error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory
- sql-syscolumns,INFORMATION_SCHEMA.columns,sysobjects
- Js中Prototype、__proto__、Constructor、Object、Function关系介绍
- object-oriented second work
- mssql的object_id
- J2SE(十八)Object之Clone
- Objective-C ---NSArray NSDictionary(梳理整理)
- Programming with Objective-C(六)