工厂方法模式 : 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
优点
1、 在工厂方法中,用户只需要知道所要产品的具体工厂,无须关心具体的创建过程,甚至不需要具体产品类的类名。
2、 在系统增加新的产品时,我们只需要添加一个具体产品类和对应的实现工厂,无需对原工厂进行任何修改,很好地符合了“开闭原则”。
缺点
1、 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,是的系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
2、大量的类暴露出来,需要自己去选择使用哪个工厂,使用起来过于繁琐。
总结
1、工厂方法模式完全符合“开闭原则”。
2、工厂方法模式使用继承,将对象的创建委托给子类,通过子类实现工厂方法来创建对象。
3、工厂方法允许类将实例化延伸到子类进行。
4、工厂方法让子类决定要实例化的类时哪一个。在这里我们要明白这并不是工厂来决定生成哪种产品,而是在编写创建者类时,不需要知道实际创建的产品是哪个,选择了使用哪个子类,就已经决定了实际创建的产品时哪个了。
5、在工厂方法模式中,创建者通常会包含依赖于抽象产品的代码,而这些抽象产品是、由子类创建的,创建者不需要真的知道在制作哪种具体产品。
项目地址: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 |
// // main.m // FactoryMothed // // Created by GameRisker on 16/1/3. // Copyright (c) 2016年 GameRisker. All rights reserved. // #import "ILeifeng.h" #import "ILeifengFactory.h" #import "UndergraduateFactory.h" #import "VolunteerFactory.h" #import <Foundation/Foundation.h> int main(int argc, const char *argv[]) { @autoreleasepool { // insert code here... // id<ILeifengFactory> factory = [[VolunteerFactory alloc] init]; id<ILeifengFactory> factory = [[UndergraduateFactory alloc] init]; id<ILeifeng> leifeng = [factory createLeifeng]; [leifeng sweep]; [leifeng wash]; [leifeng buyRice]; } return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// // ILeifeng.h // // // Created by GameRisker on 16/1/3. // // #import <Foundation/Foundation.h> @protocol ILeifeng <NSObject> - (void)sweep; - (void)wash; - (void)buyRice; @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 |
// // Undergraduate.m // // // Created by GameRisker on 16/1/3. // // #import "Undergraduate.h" @implementation Undergraduate - (void)sweep { NSLog(@"Undergraduate help the elderly to sweep"); } - (void)buyRice { NSLog(@"Undergraduate help the elderly to buy rice"); } - (void)wash { NSLog(@"Undergraduate help the elderly wash"); } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// // VolunteerFactory.m // // // Created by GameRisker on 16/1/3. // // #import "VolunteerFactory.h" @implementation VolunteerFactory - (id<ILeifeng>)createLeifeng { return [[Volunteer alloc] init]; } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// // VolunteerFactory.h // // // Created by GameRisker on 16/1/3. // // #import "ILeifengFactory.h" #import "Volunteer.h" #import <Foundation/Foundation.h> @interface VolunteerFactory : NSObject <ILeifengFactory> @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// // ILeifengFactory.h // // // Created by GameRisker on 16/1/3. // // #import "ILeifeng.h" #import <Foundation/Foundation.h> @protocol ILeifengFactory <NSObject> - (id<ILeifeng>)createLeifeng; @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// // UndergraduateFactory.m // // // Created by GameRisker on 16/1/3. // // #import "UndergraduateFactory.h" @implementation UndergraduateFactory - (id<ILeifeng>)createLeifeng { return [[Undergraduate alloc] init]; } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// // UndergraduateFactory.h // // // Created by GameRisker on 16/1/3. // // #import "ILeifengFactory.h" #import "Undergraduate.h" #import <Foundation/Foundation.h> @interface UndergraduateFactory : NSObject <ILeifengFactory> @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// // Undergraduate.h // // // Created by GameRisker on 16/1/3. // // #import "ILeifeng.h" #import <Foundation/Foundation.h> @interface Undergraduate : NSObject <ILeifeng> @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 |
// // Volunteer.m // // // Created by GameRisker on 16/1/3. // // #import "Volunteer.h" @implementation Volunteer - (void)sweep { NSLog(@"Volunteer help the elderly to sweep"); } - (void)buyRice { NSLog(@"Volunteer help the elderly to buy rice"); } - (void)wash { NSLog(@"Volunteer help the elderly to wash"); } @end |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// // Volunteer.h // // // Created by GameRisker on 16/1/3. // // #import "ILeifeng.h" #import <Foundation/Foundation.h> @interface Volunteer : NSObject <ILeifeng> @end |
参考:http://www.cnblogs.com/chenssy/(Java 版本)