写代码已经写了5年多了,自从开始写代码的时候,就买了本《大话设计模式》在研究,当时对设计模式还不是很明白,经过这么多年的沉淀,感觉对设计模式也有一些心得,但是最近不知道为何,感觉自己写的代码还是不够好,没有达到真正的面相对象开发,所以现在重新温习一下设计模式,看看能不能有一些新的体会,让我的代码能够更健壮,更加易于扩展,能更好的抵抗策划多变的需求。也随便学习一下Objective-C语言(一直想学习这么语言,但是无奈于闲暇时间太少。)
简单工厂模式
简单工厂模式又称之为静态工厂方法,属于创建型模式。在简单工厂模式中,可以根据传递的参数不同,返回不同类的实例。简单工厂模式定义了一个类,这个类专门用于创建其他类的实例,这些被创建的类都有一个共同的父类。
简单工厂模式将对象的创建和对象本身业务处理分离了,可以降低系统的耦合度,使得两者修改起来都相对容易些。当以后实现改变时,只需要修改工厂类即可。
优点:
1、简单工厂模式实现了对责任的分割,提供了专门的工厂类用于创建对象。
2、客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。
3、通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
缺点:
1、使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。
2、系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
项目地址:https://github.com/GameRisker/Study-Design-Patterns.git
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
// // main.m // SimpleFactory // 简单工厂模式 // // Created by GameRisker on 15/12/4. // Copyright (c) 2015年 GameRisker. All rights reserved. // #import "Operation.h" #import "OperationFactory.h" #import <Foundation/Foundation.h> int main(int argc, const char* argv[]) { @autoreleasepool { // insert code here... Operation* opera = [OperationFactory createOpetation:@"+"]; opera.numberA = 100; opera.numberB = 99; NSLog(@"result is %ld", [opera GetResult]); opera = [OperationFactory createOpetation:@"-"]; opera.numberA = 10; opera.numberB = 9; NSLog(@"result is %ld", [opera GetResult]); opera = [OperationFactory createOpetation:@"*"]; opera.numberA = 200; opera.numberB = 33; NSLog(@"result is %ld", [opera GetResult]); opera = [OperationFactory createOpetation:@"/"]; opera.numberA = 666; opera.numberB = 44; NSLog(@"result is %ld", [opera GetResult]); } return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// // Operation.h // // // Created by GameRisker on 15/12/4. // // #import <Foundation/Foundation.h> @interface Operation : NSObject @property (readwrite ,assign) long numberA; @property (readwrite ,assign) long numberB; - (long)GetResult; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// // Operation.m // // // Created by GameRisker on 15/12/4. // // #import "Operation.h" @implementation Operation - (long)GetResult { return 0; } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// // OperationFactory.h // // // Created by GameRisker on 15/12/5. // // #import <Foundation/Foundation.h> @interface OperationFactory : NSObject + (Operation*)createOpetation:(NSString*)operation; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
// // OperationFactory.m // // // Created by GameRisker on 15/12/5. // // #import "Operation.h" #import "OperationAdd.h" #import "OperationDiv.h" #import "OperationFactory.h" #import "OperationMul.h" #import "OperationSub.h" @implementation OperationFactory + (Operation*)createOpetation:(NSString*)operation { NSLog(@"createOperation : %@", operation); Operation* opera; if ([operation isEqualToString:@"+"]) { opera = [[OperationAdd alloc] init]; } else if ([operation isEqualToString:@"-"]) { opera = [[OperationSub alloc] init]; } else if ([operation isEqualToString:@"*"]) { opera = [[OperationMul alloc] init]; } else if ([operation isEqualToString:@"/"]) { opera = [[OperationDiv alloc] init]; } return opera; } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// // OperationAdd.h // // // Created by GameRisker on 15/12/5. // // #import "Operation.h" @interface OperationAdd : Operation @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// // OperationAdd.m // // // Created by GameRisker on 15/12/5. // // #import "OperationAdd.h" @implementation OperationAdd - (long)GetResult { long result = 0; result = self.numberA + self.numberB; return result; } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// // OperationSub.h // // // Created by GameRisker on 15/12/5. // // #import "Operation.h" @interface OperationSub : Operation @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// // OperationSub.m // // // Created by GameRisker on 15/12/5. // // #import "OperationSub.h" @implementation OperationSub -(long) GetResult { return self.numberA - self.numberB; } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// // OperationMul.h // // // Created by GameRisker on 15/12/5. // // #import "Operation.h" @interface OperationMul : Operation @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// // OperationMul.m // // // Created by GameRisker on 15/12/5. // // #import "OperationMul.h" @implementation OperationMul -(long) GetResult { return self.numberA * self.numberB; } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// // OperationDiv.h // // // Created by GameRisker on 15/12/5. // // #import "Operation.h" @interface OperationDiv : Operation @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// // OperationDiv.m // // // Created by GameRisker on 15/12/5. // // #import "OperationDiv.h" @implementation OperationDiv - (long)GetResult { if (self.numberB == 0) { NSLog(@"numberB is zero!"); return 0; } return self.numberA / self.numberB; } @end |
参考:http://www.cnblogs.com/chenssy/(Java 版本)