设计模式之抽象工厂模式20170803
创建型设计模式之抽象工厂模式:
一、含义
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。
具体来说,
为一组具有相同约束(属性)的对象,提供一个接口,这个接口下有不同的实现,每个实现类对应一种类型的约束(一种具体的属性),同时提供该类型的约束(属性)下所有对象的创建方法
二、代码说明
1.主要有两个角色
1)一组互相影响的产品线(对象),也叫做产品族
2)抽象工厂类及其实现类
抽象工厂类:在N个产品族中,在抽象工厂类中就应该有N个创建方法
实现类:具体实现类是产品族的具体属性(约束条件)的体现,每个实现类都能创建所有的产品族。
例如,有M个产品等级就应该有M个实现工厂类(约束条件是产品等级),在每个实现工厂中,实现相应等级的所有产品族的生产任务。
2.在用C实现过程中也是参考这种思想,以创造男人、女人举例,具体实现如下:
1)抽象工厂模式使用场景:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /***************************************************************************** 2 * Copyright (C) 2017-2018 Hanson Yu All rights reserved. 3 ------------------------------------------------------------------------------ 4 * File Module : AbstractFactoryPatternUsage.c 5 * Description : 抽象工厂模式的使用 6 7 book@book-desktop:/work/projects/test/DesignPatterns/AbstractFactoryPattern$ gcc -o AbstractFactoryPatternUsage MaleYellowHuman.c MaleBlackHuman.c MaleWhiteHuman.c BlackHuman.c WhiteHuman.c YellowHuman.c FemaleBlackHuman.c FemaleYellowHuman.c FemaleWhiteHuman.c FemaleHumanFactory.c MaleHumanFactory.c AbstractFactoryPattern.c AbstractFactoryPatternUsage.c 8 book@book-desktop:/work/projects/test/DesignPatterns/AbstractFactoryPattern$ ./AbstractFactoryPatternUsage 9 ------------创造一个黄色女性:------------ 10 黄色人种的皮肤是黄色的 11 黄色人种会说话,一般说的是双字节 12 黄人女性 13 ------------创造一个黄色男性:------------ 14 黄色人种的皮肤是黄色的 15 黄色人种会说话,一般说的是双字节 16 黄人男性 17 18 * Created : 2017.08.02. 19 * Author : Yu Weifeng 20 * Function List : 21 * Last Modified : 22 * History : 23 ******************************************************************************/ 24 #include <stdio.h> 25 #include <stdlib.h> 26 #include <string.h> 27 #include "AbstractFactoryPattern.h" 28 29 30 31 32 /***************************************************************************** 33 -Fuction : main 34 -Description : 35 -Input : 36 -Output : 37 -Return : 38 * Modify Date Version Author Modification 39 * ----------------------------------------------- 40 * 2017/08/02 V1.0.0 Yu Weifeng Created 41 ******************************************************************************/ 42 int main(int argc,char **argv) 43 { 44 T_HumanFactory tFemaleHumanFactory=newFemaleHumanFactory; 45 T_HumanFactory tMaleHumanFactory=newMaleHumanFactory; 46 47 T_Human tMaleYellowHuman =tMaleHumanFactory.CreateYellowHuman(); 48 T_Human tFemaleYellowHuman =tFemaleHumanFactory.CreateYellowHuman(); 49 printf("------------创造一个黄色女性:------------\r\n"); 50 tFemaleYellowHuman.GetColor(); 51 tFemaleYellowHuman.Talk(); 52 tFemaleYellowHuman.GetSex(); 53 printf("------------创造一个黄色男性:------------\r\n"); 54 tMaleYellowHuman.GetColor(); 55 tMaleYellowHuman.Talk(); 56 tMaleYellowHuman.GetSex(); 57 58 return 0; 59 }
2)被调用者:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /***************************************************************************** 2 * Copyright (C) 2017-2018 Hanson Yu All rights reserved. 3 ------------------------------------------------------------------------------ 4 * File Module : AbstractFactoryPattern.c 5 * Description : 抽象工厂模式 6 7 以创造男人、女人举例 8 9 * Created : 2017.08.02. 10 * Author : Yu Weifeng 11 * Function List : 12 * Last Modified : 13 * History : 14 ******************************************************************************/ 15 #include <stdio.h> 16 #include <stdlib.h> 17 #include <string.h> 18 #include "AbstractFactoryPattern.h"
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /***************************************************************************** 2 * Copyright (C) 2017-2018 Hanson Yu All rights reserved. 3 ------------------------------------------------------------------------------ 4 * File Module : AbstractFactoryPattern.h 5 * Description : 抽象工厂模式 6 7 * Created : 2017.08.02. 8 * Author : Yu Weifeng 9 * Function List : 10 * Last Modified : 11 * History : 12 ******************************************************************************/ 13 #ifndef ABSTRACT_FACTORY_PATTERN_H 14 #define ABSTRACT_FACTORY_PATTERN_H 15 16 17 typedef struct Human 18 { 19 void (*GetColor)(); 20 void (*Talk)(); 21 void (*GetSex)(); 22 }T_Human; 23 24 typedef struct HumanFactory 25 { 26 T_Human (*CreateYellowHuman)(); 27 T_Human (*CreateWhiteHuman)(); 28 T_Human (*CreateBlackHuman)(); 29 }T_HumanFactory; 30 31 T_Human MaleHumanFactoryCreateYellowHuman(); 32 T_Human MaleHumanFactoryCreateWhiteHuman(); 33 T_Human MaleHumanFactoryCreateBlackHuman(); 34 #define newMaleHumanFactory {MaleHumanFactoryCreateYellowHuman,MaleHumanFactoryCreateWhiteHuman,MaleHumanFactoryCreateBlackHuman} 35 36 T_Human FemaleHumanFactoryCreateYellowHuman(); 37 T_Human FemaleHumanFactoryCreateWhiteHuman(); 38 T_Human FemaleHumanFactoryCreateBlackHuman(); 39 #define newFemaleHumanFactory {FemaleHumanFactoryCreateYellowHuman,FemaleHumanFactoryCreateWhiteHuman,FemaleHumanFactoryCreateBlackHuman} 40 41 42 43 #endif
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /***************************************************************************** 2 * Copyright (C) 2017-2018 Hanson Yu All rights reserved. 3 ------------------------------------------------------------------------------ 4 * File Module : BlackHuman.c 5 * Description : 抽象工厂模式 6 本文件是黑人的具体实现 7 8 * Created : 2017.08.02. 9 * Author : Yu Weifeng 10 * Function List : 11 * Last Modified : 12 * History : 13 ******************************************************************************/ 14 #include <stdio.h> 15 #include <stdlib.h> 16 #include <string.h> 17 #include "AbstractFactoryPattern.h" 18 19 20 21 /***************************************************************************** 22 -Fuction : YellowHumanGetColor 23 -Description : 公有函数 24 -Input : 25 -Output : 26 -Return : 27 * Modify Date Version Author Modification 28 * ----------------------------------------------- 29 * 2017/08/02 V1.0.0 Yu Weifeng Created 30 ******************************************************************************/ 31 void BlackHumanGetColor() 32 { 33 printf("黑色人种的皮肤是黑色的\r\n"); 34 } 35 36 /***************************************************************************** 37 -Fuction : YellowHumanTalk 38 -Description : 公有函数 39 -Input : 40 -Output : 41 -Return : 42 * Modify Date Version Author Modification 43 * ----------------------------------------------- 44 * 2017/08/02 V1.0.0 Yu Weifeng Created 45 ******************************************************************************/ 46 void BlackHumanTalk() 47 { 48 printf("黑色人种会说话,一般人听不懂\r\n"); 49 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /***************************************************************************** 2 * Copyright (C) 2017-2018 Hanson Yu All rights reserved. 3 ------------------------------------------------------------------------------ 4 * File Module : WhiteHuman.c 5 * Description : 抽象工厂模式 6 本文件是白人的具体实现 7 8 * Created : 2017.08.02. 9 * Author : Yu Weifeng 10 * Function List : 11 * Last Modified : 12 * History : 13 ******************************************************************************/ 14 #include <stdio.h> 15 #include <stdlib.h> 16 #include <string.h> 17 #include "AbstractFactoryPattern.h" 18 19 20 21 /***************************************************************************** 22 -Fuction : WhiteHumanGetColor 23 -Description : 公有函数 24 -Input : 25 -Output : 26 -Return : 27 * Modify Date Version Author Modification 28 * ----------------------------------------------- 29 * 2017/08/02 V1.0.0 Yu Weifeng Created 30 ******************************************************************************/ 31 void WhiteHumanGetColor() 32 { 33 printf("白色人种的皮肤是白色的\r\n"); 34 } 35 36 /***************************************************************************** 37 -Fuction : WhiteHumanGetColor 38 -Description : 公有函数 39 -Input : 40 -Output : 41 -Return : 42 * Modify Date Version Author Modification 43 * ----------------------------------------------- 44 * 2017/08/02 V1.0.0 Yu Weifeng Created 45 ******************************************************************************/ 46 void WhiteHumanTalk() 47 { 48 printf("白色人种会说话,一般说的是单字节\r\n"); 49 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /***************************************************************************** 2 * Copyright (C) 2017-2018 Hanson Yu All rights reserved. 3 ------------------------------------------------------------------------------ 4 * File Module : YellowHuman.c 5 * Description : 抽象工厂模式 6 本文件是黄人的具体实现 7 8 * Created : 2017.08.02. 9 * Author : Yu Weifeng 10 * Function List : 11 * Last Modified : 12 * History : 13 ******************************************************************************/ 14 #include <stdio.h> 15 #include <stdlib.h> 16 #include <string.h> 17 #include "AbstractFactoryPattern.h" 18 19 20 21 /***************************************************************************** 22 -Fuction : YellowHumanGetColor 23 -Description : 公有函数 24 -Input : 25 -Output : 26 -Return : 27 * Modify Date Version Author Modification 28 * ----------------------------------------------- 29 * 2017/08/02 V1.0.0 Yu Weifeng Created 30 ******************************************************************************/ 31 void YellowHumanGetColor() 32 { 33 printf("黄色人种的皮肤是黄色的\r\n"); 34 } 35 36 /***************************************************************************** 37 -Fuction : YellowHumanTalk 38 -Description : 公有函数 39 -Input : 40 -Output : 41 -Return : 42 * Modify Date Version Author Modification 43 * ----------------------------------------------- 44 * 2017/08/02 V1.0.0 Yu Weifeng Created 45 ******************************************************************************/ 46 void YellowHumanTalk() 47 { 48 printf("黄色人种会说话,一般说的是双字节\r\n"); 49 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /***************************************************************************** 2 * Copyright (C) 2017-2018 Hanson Yu All rights reserved. 3 ------------------------------------------------------------------------------ 4 * File Module : FemaleBlackHuman.c 5 * Description : 抽象工厂模式 6 本文件是女性黑人的具体实现 7 8 * Created : 2017.08.02. 9 * Author : Yu Weifeng 10 * Function List : 11 * Last Modified : 12 * History : 13 ******************************************************************************/ 14 #include <stdio.h> 15 #include <stdlib.h> 16 #include <string.h> 17 #include "AbstractFactoryPattern.h" 18 19 20 21 /***************************************************************************** 22 -Fuction : FemaleBlackHumanGetSex 23 -Description : 公有函数 24 -Input : 25 -Output : 26 -Return : 27 * Modify Date Version Author Modification 28 * ----------------------------------------------- 29 * 2017/08/02 V1.0.0 Yu Weifeng Created 30 ******************************************************************************/ 31 void FemaleBlackHumanGetSex() 32 { 33 printf("黑人女性\r\n"); 34 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /***************************************************************************** 2 * Copyright (C) 2017-2018 Hanson Yu All rights reserved. 3 ------------------------------------------------------------------------------ 4 * File Module : FemaleWhiteHuman.c 5 * Description : 抽象工厂模式 6 本文件是女性白人的具体实现 7 8 * Created : 2017.08.02. 9 * Author : Yu Weifeng 10 * Function List : 11 * Last Modified : 12 * History : 13 ******************************************************************************/ 14 #include <stdio.h> 15 #include <stdlib.h> 16 #include <string.h> 17 #include "AbstractFactoryPattern.h" 18 19 20 21 /***************************************************************************** 22 -Fuction : FemaleWhiteHumanGetSex 23 -Description : 公有函数 24 -Input : 25 -Output : 26 -Return : 27 * Modify Date Version Author Modification 28 * ----------------------------------------------- 29 * 2017/08/02 V1.0.0 Yu Weifeng Created 30 ******************************************************************************/ 31 void FemaleWhiteHumanGetSex() 32 { 33 printf("白人女性\r\n"); 34 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /***************************************************************************** 2 * Copyright (C) 2017-2018 Hanson Yu All rights reserved. 3 ------------------------------------------------------------------------------ 4 * File Module : FemaleYellowHuman.c 5 * Description : 抽象工厂模式 6 本文件是女性黄人的具体实现 7 8 * Created : 2017.08.02. 9 * Author : Yu Weifeng 10 * Function List : 11 * Last Modified : 12 * History : 13 ******************************************************************************/ 14 #include <stdio.h> 15 #include <stdlib.h> 16 #include <string.h> 17 #include "AbstractFactoryPattern.h" 18 19 20 21 /***************************************************************************** 22 -Fuction : FemaleYellowHumanGetSex 23 -Description : 公有函数 24 -Input : 25 -Output : 26 -Return : 27 * Modify Date Version Author Modification 28 * ----------------------------------------------- 29 * 2017/08/02 V1.0.0 Yu Weifeng Created 30 ******************************************************************************/ 31 void FemaleYellowHumanGetSex() 32 { 33 printf("黄人女性\r\n"); 34 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /***************************************************************************** 2 * Copyright (C) 2017-2018 Hanson Yu All rights reserved. 3 ------------------------------------------------------------------------------ 4 * File Module : MaleBlackHuman.c 5 * Description : 抽象工厂模式 6 本文件是男性黑人的具体实现 7 8 * Created : 2017.08.02. 9 * Author : Yu Weifeng 10 * Function List : 11 * Last Modified : 12 * History : 13 ******************************************************************************/ 14 #include <stdio.h> 15 #include <stdlib.h> 16 #include <string.h> 17 #include "AbstractFactoryPattern.h" 18 19 20 21 /***************************************************************************** 22 -Fuction : MaleBlackHumanGetSex 23 -Description : 公有函数 24 -Input : 25 -Output : 26 -Return : 27 * Modify Date Version Author Modification 28 * ----------------------------------------------- 29 * 2017/08/02 V1.0.0 Yu Weifeng Created 30 ******************************************************************************/ 31 void MaleBlackHumanGetSex() 32 { 33 printf("黑人男性\r\n"); 34 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /***************************************************************************** 2 * Copyright (C) 2017-2018 Hanson Yu All rights reserved. 3 ------------------------------------------------------------------------------ 4 * File Module : MaleWhiteHuman.c 5 * Description : 抽象工厂模式 6 本文件是男性白人的具体实现 7 8 * Created : 2017.08.02. 9 * Author : Yu Weifeng 10 * Function List : 11 * Last Modified : 12 * History : 13 ******************************************************************************/ 14 #include <stdio.h> 15 #include <stdlib.h> 16 #include <string.h> 17 #include "AbstractFactoryPattern.h" 18 19 20 21 /***************************************************************************** 22 -Fuction : MaleWhiteHumanGetSex 23 -Description : 公有函数 24 -Input : 25 -Output : 26 -Return : 27 * Modify Date Version Author Modification 28 * ----------------------------------------------- 29 * 2017/08/02 V1.0.0 Yu Weifeng Created 30 ******************************************************************************/ 31 void MaleWhiteHumanGetSex() 32 { 33 printf("白人男性\r\n"); 34 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /***************************************************************************** 2 * Copyright (C) 2017-2018 Hanson Yu All rights reserved. 3 ------------------------------------------------------------------------------ 4 * File Module : MaleYellowHuman.c 5 * Description : 抽象工厂模式 6 本文件是男性黄人的具体实现 7 8 * Created : 2017.08.02. 9 * Author : Yu Weifeng 10 * Function List : 11 * Last Modified : 12 * History : 13 ******************************************************************************/ 14 #include <stdio.h> 15 #include <stdlib.h> 16 #include <string.h> 17 #include "AbstractFactoryPattern.h" 18 19 20 21 /***************************************************************************** 22 -Fuction : MaleYellowHumanGetSex 23 -Description : 公有函数 24 -Input : 25 -Output : 26 -Return : 27 * Modify Date Version Author Modification 28 * ----------------------------------------------- 29 * 2017/08/02 V1.0.0 Yu Weifeng Created 30 ******************************************************************************/ 31 void MaleYellowHumanGetSex() 32 { 33 printf("黄人男性\r\n"); 34 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /***************************************************************************** 2 * Copyright (C) 2017-2018 Hanson Yu All rights reserved. 3 ------------------------------------------------------------------------------ 4 * File Module : FemaleHumanFactory.c 5 * Description : 抽象工厂模式 6 本文件是女性人类工厂(创造女性)的具体实现 7 8 * Created : 2017.08.02. 9 * Author : Yu Weifeng 10 * Function List : 11 * Last Modified : 12 * History : 13 ******************************************************************************/ 14 #include <stdio.h> 15 #include <stdlib.h> 16 #include <string.h> 17 #include "AbstractFactoryPattern.h" 18 19 void BlackHumanGetColor(); 20 void BlackHumanTalk(); 21 22 void WhiteHumanGetColor(); 23 void WhiteHumanTalk(); 24 25 void YellowHumanGetColor(); 26 void YellowHumanTalk(); 27 28 void FemaleBlackHumanGetSex(); 29 #define newFemaleBlackHuman {BlackHumanGetColor,BlackHumanTalk,FemaleBlackHumanGetSex} 30 31 void FemaleWhiteHumanGetSex(); 32 #define newFemaleWhiteHuman {WhiteHumanGetColor,WhiteHumanTalk,FemaleWhiteHumanGetSex} 33 34 void FemaleYellowHumanGetSex(); 35 #define newFemaleYellowHuman {YellowHumanGetColor,YellowHumanTalk,FemaleYellowHumanGetSex} 36 37 /***************************************************************************** 38 -Fuction : FemaleHumanFactoryCreateYellowHuman 39 -Description : 公有函数 40 -Input : 41 -Output : 42 -Return : 43 * Modify Date Version Author Modification 44 * ----------------------------------------------- 45 * 2017/08/02 V1.0.0 Yu Weifeng Created 46 ******************************************************************************/ 47 T_Human FemaleHumanFactoryCreateYellowHuman() 48 { 49 T_Human tHuman=newFemaleYellowHuman; 50 return tHuman; 51 } 52 53 /***************************************************************************** 54 -Fuction : FemaleHumanFactoryCreateWhiteHuman 55 -Description : 公有函数 56 -Input : 57 -Output : 58 -Return : 59 * Modify Date Version Author Modification 60 * ----------------------------------------------- 61 * 2017/08/02 V1.0.0 Yu Weifeng Created 62 ******************************************************************************/ 63 T_Human FemaleHumanFactoryCreateWhiteHuman() 64 { 65 T_Human tHuman=newFemaleWhiteHuman; 66 return tHuman; 67 } 68 69 /***************************************************************************** 70 -Fuction : FemaleHumanFactoryCreateBlackHuman 71 -Description : 公有函数 72 -Input : 73 -Output : 74 -Return : 75 * Modify Date Version Author Modification 76 * ----------------------------------------------- 77 * 2017/08/02 V1.0.0 Yu Weifeng Created 78 ******************************************************************************/ 79 T_Human FemaleHumanFactoryCreateBlackHuman() 80 { 81 T_Human tHuman=newFemaleBlackHuman; 82 return tHuman; 83 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /***************************************************************************** 2 * Copyright (C) 2017-2018 Hanson Yu All rights reserved. 3 ------------------------------------------------------------------------------ 4 * File Module : MaleHumanFactory.c 5 * Description : 抽象工厂模式 6 本文件是男性人类工厂(创造男性)的具体实现 7 8 * Created : 2017.08.02. 9 * Author : Yu Weifeng 10 * Function List : 11 * Last Modified : 12 * History : 13 ******************************************************************************/ 14 #include <stdio.h> 15 #include <stdlib.h> 16 #include <string.h> 17 #include "AbstractFactoryPattern.h" 18 19 void BlackHumanGetColor(); 20 void BlackHumanTalk(); 21 22 void WhiteHumanGetColor(); 23 void WhiteHumanTalk(); 24 25 void YellowHumanGetColor(); 26 void YellowHumanTalk(); 27 28 void MaleBlackHumanGetSex(); 29 #define newMaleBlackHuman {BlackHumanGetColor,BlackHumanTalk,MaleBlackHumanGetSex} 30 31 void MaleWhiteHumanGetSex(); 32 #define newMaleWhiteHuman {WhiteHumanGetColor,WhiteHumanTalk,MaleWhiteHumanGetSex} 33 34 void MaleYellowHumanGetSex(); 35 #define newMaleYellowHuman {YellowHumanGetColor,YellowHumanTalk,MaleYellowHumanGetSex} 36 37 /***************************************************************************** 38 -Fuction : MaleHumanFactoryCreateYellowHuman 39 -Description : 公有函数 40 -Input : 41 -Output : 42 -Return : 43 * Modify Date Version Author Modification 44 * ----------------------------------------------- 45 * 2017/08/02 V1.0.0 Yu Weifeng Created 46 ******************************************************************************/ 47 T_Human MaleHumanFactoryCreateYellowHuman() 48 { 49 T_Human tHuman=newMaleYellowHuman; 50 return tHuman; 51 } 52 53 /***************************************************************************** 54 -Fuction : MaleHumanFactoryCreateWhiteHuman 55 -Description : 公有函数 56 -Input : 57 -Output : 58 -Return : 59 * Modify Date Version Author Modification 60 * ----------------------------------------------- 61 * 2017/08/02 V1.0.0 Yu Weifeng Created 62 ******************************************************************************/ 63 T_Human MaleHumanFactoryCreateWhiteHuman() 64 { 65 T_Human tHuman=newMaleWhiteHuman; 66 return tHuman; 67 } 68 69 /***************************************************************************** 70 -Fuction : MaleHumanFactoryCreateBlackHuman 71 -Description : 公有函数 72 -Input : 73 -Output : 74 -Return : 75 * Modify Date Version Author Modification 76 * ----------------------------------------------- 77 * 2017/08/02 V1.0.0 Yu Weifeng Created 78 ******************************************************************************/ 79 T_Human MaleHumanFactoryCreateBlackHuman() 80 { 81 T_Human tHuman=newMaleBlackHuman; 82 return tHuman; 83 }
3)执行结果:
book@book-desktop:/work/projects/test/DesignPatterns/AbstractFactoryPattern$ gcc -o AbstractFactoryPatternUsage MaleYellowHuman.c MaleBlackHuman.c MaleWhiteHuman.c BlackHuman.c WhiteHuman.c YellowHuman.c FemaleBlackHuman.c FemaleYellowHuman.c FemaleWhiteHuman.c FemaleHumanFactory.c MaleHumanFactory.c AbstractFactoryPattern.c AbstractFactoryPatternUsage.c
book@book-desktop:/work/projects/test/DesignPatterns/AbstractFactoryPattern$ ./AbstractFactoryPatternUsage
------------创造一个黄色女性:------------
黄色人种的皮肤是黄色的
黄色人种会说话,一般说的是双字节
黄人女性
------------创造一个黄色男性:------------
黄色人种的皮肤是黄色的
黄色人种会说话,一般说的是双字节
黄人男性
4)详细代码:
https://github.com/fengweiyu/DesignThinking/tree/master/DesignPatterns/CreationalDesignPatterns/AbstractFactoryPattern
三、使用场景
1.一个对象族(或是一组没有任何关系的对象)都有相同的约束(属性),则可以使用抽象工厂模式。
可以使用抽象工厂模式产生不同类型的约束条件的对象。
例如上述例子中,人种都约束于性别这个条件,所以使用抽象工厂模式,有两种性别男和女,所以有两个具体的工厂类,男工厂产生约束条件是男性的人种,女工厂产生约束条件是女性的人种。
四、优点
1.封装性
每个产品的实现类不是高层模块要关心的,只要知道工厂类是谁,就能创建出一个需要的对象。
2.产品族内的约束为非公开状态
生产过程对调用工厂类的高层模块来说是透明的,它不需要知道这个约束(就是要一个黄色女性产品就可以了),具体的产品族内的约束是在工厂内实现的。
五、缺点
1.最大缺点就是产品族扩展非常困难
如果要增加产品家族,那么抽象类要增加一个方法,然后两个实现类也要修改,严重违反了开闭原则,而且修改抽象类是不允许的,抽象类和接口是一个契约,改变契约,所有与契约有关的代码都要修改,这显然是不行的。
注意:
是产品族扩展困难,而不是产品等级。产品等级在该模式下是非常容易扩展的,只要增加一个工厂类负责新增加出来的产品生产任务即可。也就是说横向扩展容易,纵向扩展困难。
六、与其他模式的区别
1、抽象工厂模式与工厂方法模式
1)抽象工厂模式是工厂方法模式的升级版本,抽象工厂模式对工厂进行抽象,具体工厂类之间的属性(约束条件)不同(创造出来的产品(对象)的具体属性不同),每个具体工厂类都有各自的属性。
2)抽象工厂模式产品族扩展非常困难,也就是说横向扩展容易,纵向扩展困难。而工厂方法模式只有一个扩展方向,所以不存在这个问题
2、抽象工厂模式与建造者模式
抽象工厂模式实现对产品家族的创建,一个产品家族是这样的一系列产品:具有不同分类维度的产品组合,采用抽象工厂模式则是不需要关系构建过程,只关心什么产品由什么工厂生成即可。
而建造者模式则是要求按照指定的蓝图建造产品,它的主要目的是通过组装零配件而产生一个新产品,两者的区别还是比较明显的。
具体来说,
1)抽象工厂模式就好比是一个一个的工厂,对外界来说,只要关心一个工厂到底是生产什么产品的,不用关心具体怎么生产。
而建造者模式就不同了,它是由车间组成,不同的车间完成不同的创建和装配任务,车间主任(导演类)给建造车间什么蓝图就能生产什么产品,建造者模式更关心建造过程。
2)相对来说,抽象工厂模式比建造者模式的尺度要大,它关注产品整体,而建造者模式关注构建过程,因此建造者模式可以很容易地构建出一个崭新的产品,只要导演类能够提供具体的工艺流程。
3)两者的应用场景截然不同,如果希望屏蔽对象的创建过程,只提供一个封装良好的对象,则可以选择抽象工厂方法模式。
而建造者模式可以用在构件的装配方面,如通过装配不同的组件或相同组件的不同顺序,可以产生出一个新的对象,它可以产生一个非常灵活的架构,方便地扩展和维护系统。