简单工厂是一个实体类,包含了根据不同参数直接创建对象的方法。而抽象工厂(Abstract Factory pattern)则是在简单工厂的基础上将(多个)工厂类进一步进行抽象(如UML图示):
在工程中,我们创建了两个实体类:动物类(Animal)和植物类(Plant);这两个类分别遵循协议AnimalProtocol和PlantProtocol;分别有子类Dog、Fish、Bird(继承自Animal类)和Rose、Sakura(继承自Plant类);这两个实体类分别通过工厂类AnimalFactory和PlantFactory进行实例化(均继承自BioligyFactory工厂类);在此基础上,将工厂类进一步抽象,通过抽象工厂类AbstractFactory对工厂类进行实例化。
代码实现:
1.Animal、AnimalFactory、BiologyFactory
Animal、AnimalFactory代码在《》中已经创建,只需要将AnimaFactory继承于BiologyFactory并将类方法改为实例方法即可。
1 // BiologyFactory.h 2 #import3 #import "Plant.h" 4 #import "Animal.h" 5 6 typedef NS_ENUM(NSInteger, EFactory){ 7 kAnimalFactory, 8 kPlantFactory, 9 };10 11 typedef NS_ENUM(NSInteger, EPlantType){12 kRose,13 kSakura,14 };15 16 typedef enum {17 kDog,18 kBird,19 kFish,20 }EAnimalType;21 22 @interface BiologyFactory : NSObject23 24 - (Plant*)createPlantWithType:(EPlantType)type;25 26 - (Animal*)createAnimalWithType:(EAnimalType)type;27 28 @end
2.Plant、PlantFactory
1 // Plant.h 2 #import3 4 @protocol PlantProtocol 5 @optional 6 - (void)flower; 7 - (void)color; 8 @end 9 10 @interface Plant : NSObject 11 12 @end13 14 // Rose.h15 #import "Plant.h"16 17 @interface Rose : Plant18 19 - (void)thorn;20 21 @end22 23 // Sakura.h24 #import "Plant.h"25 26 @interface Sakura : Plant27 28 - (void)enjoyFlower;29 30 @end
1 // PlantFactory.h 2 #import "BiologyFactory.h" 3 #import "Rose.h" 4 #import "Sakura.h" 5 6 @interface PlantFactory : BiologyFactory 7 8 - (Plant*)createPlantWithType:(EPlantType)type; 9 10 @end11 12 // PlantFactory.m13 #import "PlantFactory.h"14 15 @implementation PlantFactory16 17 - (Plant *)createPlantWithType:(EPlantType)type{18 Plant *plant = nil;19 if(type == kRose){20 plant = [Rose new];21 }else if(type == kSakura){22 plant = [Sakura new];23 }24 return plant;25 }26 27 @end
3.AbstractFactory创建
1 // AbstractFactory.h 2 #import3 #import "BiologyFactory.h" 4 #import "AnimalFactory.h" 5 #import "PlantFactory.h" 6 7 @interface AbstractFactory : NSObject 8 9 + (BiologyFactory*)createFactoryWithType:(EFactory)type;10 11 @end12 13 // AbstractFactory.m14 #import "AbstractFactory.h"15 16 @implementation AbstractFactory17 18 + (BiologyFactory*)createFactoryWithType:(EFactory)type{19 BiologyFactory *factory = nil;20 if(type == kAnimalFactory){21 factory = [AnimalFactory new];22 }else if(type == kPlantFactory){23 factory = [PlantFactory new];24 }25 return factory;26 }27 28 @end