请选择 进入手机版 | 继续访问电脑版
搜索
查看: 227|回复: 1

设计模式系列之抽象工厂模式

[复制链接]
发表于 2017-5-17 10:28 | 显示全部楼层 |阅读模式
重新思考一下前两篇文章提到的芯片设计软件,factory method模式可以通过实例化 RoundFactory,RecFactory和TriFactory来分别实现 MaskRound, MaskRec和MaskTri对象,将在掩模上设计圆形,矩形和三角形的功能延迟到子类当中,不过 MaskRound,MaskRec和MaskTri都继承自同一种Mask,假设现在光刻技术有了新的突破,需要在新的类型的Mask上设计芯片图形,factory method就无能为力了,这就要用到本文讲的abstract factory模式。
假设现在有两种掩模,maskA和maskB,abstract factory模式的类结构图如下:
22.png
maskA和maskB是两个独立的产品系列,具有独立的 MaskRound,MaskRec和MaskTri子类。 FigureFactory分别定义 CreateFigureA和 CreateFigureB创建maksA和maskB的图形。
代码实现如下:

  1. //maskA.hpp
  2. #ifndef MASKA_HPP
  3. #define MASKA_HPP

  4. class MaskAFigure{
  5.   public:
  6.     virtual ~MaskAFigure()=0;
  7.   protected:
  8.     MaskAFigure();
  9. };

  10. class MaskARound:public MaskAFigure {
  11.   public:
  12.     MaskARound();
  13.     ~MaskARound();
  14. };

  15. class MaskARec:public MaskAFigure {
  16.   public:
  17.     MaskARec();
  18.     ~MaskARec();
  19. };

  20. class MaskATri:public MaskAFigure {
  21.   public:
  22.     MaskATri();
  23.     ~MaskATri();
  24. };
  25. #endif
  26. //maskA.cpp
  27. #include <iostream>
  28. #include "maskA.hpp"

  29. using std::cout;
  30. using std::endl;

  31. MaskAFigure::MaskAFigure() {

  32. }

  33. MaskAFigure::~MaskAFigure() {

  34. }

  35. MaskARound::MaskARound() {
  36.   cout<<"Draw roundness on MaskA"<<endl;
  37. }

  38. MaskARound::~MaskARound() {

  39. }

  40. MaskARec::MaskARec() {
  41.   cout<<"Draw rectangle on MaskA"<<endl;
  42. }

  43. MaskARec::~MaskARec() {

  44. }

  45. MaskATri::MaskATri() {
  46.   cout<<"Draw triangle on MaskA"<<endl;
  47. }

  48. MaskATri::~MaskATri() {

  49. }
  50. //maskB.hpp
  51. #ifndef MASKB_HPP
  52. #define MASKB_HPP

  53. class MaskBFigure{
  54.   public:
  55.     virtual ~MaskBFigure()=0;
  56.   protected:
  57.     MaskBFigure();
  58. };

  59. class MaskBRound:public MaskBFigure {
  60.   public:
  61.     MaskBRound();
  62.     ~MaskBRound();
  63. };

  64. class MaskBRec:public MaskBFigure {
  65.   public:
  66.     MaskBRec();
  67.     ~MaskBRec();
  68. };

  69. class MaskBTri:public MaskBFigure {
  70.   public:
  71.     MaskBTri();
  72.     ~MaskBTri();
  73. };

  74. #endif
  75. //maskB.cpp
  76. #include <iostream>
  77. #include "maskB.hpp"

  78. using std::cout;
  79. using std::endl;

  80. MaskBFigure::MaskBFigure() {

  81. }

  82. MaskBFigure::~MaskBFigure() {

  83. }

  84. MaskBRound::MaskBRound() {
  85.   cout<<"Draw roundness on MaskB"<<endl;
  86. }

  87. MaskBRound::~MaskBRound() {

  88. }

  89. MaskBRec::MaskBRec() {
  90.   cout<<"Draw rectangle on MaskB"<<endl;
  91. }

  92. MaskBRec::~MaskBRec() {

  93. }

  94. MaskBTri::MaskBTri() {
  95.   cout<<"Draw triangle on MaskB"<<endl;
  96. }

  97. MaskBTri::~MaskBTri() {

  98. }
  99. //abstractfactory.hpp
  100. #ifndef ABSTRACT_MASKFACTORY_HPP
  101. #define ABSTRACT_MASKFACTORY_HPP

  102. #include "maskB.hpp"
  103. #include "maskA.hpp"

  104. class FigureFactory {
  105. public:
  106.   virtual ~FigureFactory()=0;
  107.   virtual MaskAFigure* CreateFigureA()=0;
  108.   virtual MaskBFigure* CreateFigureB()=0;
  109. protected:
  110.   FigureFactory();
  111. };

  112. class RoundFactory:public FigureFactory {
  113. public:
  114.   RoundFactory();
  115.   ~RoundFactory();
  116.   MaskARound* CreateFigureA();
  117.   MaskBRound* CreateFigureB();
  118. };

  119. class RecFactory:public FigureFactory {
  120. public:
  121.   RecFactory();
  122.   ~RecFactory();
  123.   MaskARec* CreateFigureA();
  124.   MaskBRec* CreateFigureB();
  125. };

  126. class TriFactory:public FigureFactory {
  127. public:
  128.   TriFactory();
  129.   ~TriFactory();
  130.   MaskATri* CreateFigureA();
  131.   MaskBTri* CreateFigureB();
  132. };

  133. #endif
  134. //abstractfactory.cpp
  135. #include <iostream>
  136. #include "abstractfactory.hpp"

  137. using std::cout;
  138. using std::endl;

  139. FigureFactory::FigureFactory() {

  140. }

  141. FigureFactory::~FigureFactory() {

  142. }

  143. RoundFactory::RoundFactory() {
  144.   cout<<"Init RoundFactory"<<endl;
  145. }

  146. RoundFactory::~RoundFactory() {

  147. }

  148. MaskARound* RoundFactory::CreateFigureA() {
  149.   return new MaskARound();
  150. }

  151. MaskBRound* RoundFactory::CreateFigureB() {
  152.   return new MaskBRound();
  153. }

  154. RecFactory::RecFactory() {
  155.   cout<<"Init RecFactory"<<endl;
  156. }

  157. RecFactory::~RecFactory() {

  158. }

  159. MaskARec* RecFactory::CreateFigureA() {
  160.   return new MaskARec();
  161. }

  162. TriFactory::TriFactory() {
  163.   cout<<"Init TriFactory"<<endl;
  164. }

  165. TriFactory::~TriFactory() {

  166. }

  167. MaskATri* TriFactory::CreateFigureA() {
  168.   return new MaskATri();
  169. }

  170. MaskBTri* TriFactory::CreateFigureB() {
  171.   return new MaskBTri();
  172. }
  173. //main.cpp
  174. #include <iostream>
  175. #include <memory>
  176. #include "abstractfactory.hpp"

  177. using std::cout;
  178. using std::endl;
  179. using std::shared_ptr;


  180. int main() {
  181.   shared_ptr<RoundFactory> rof(new RoundFactory());
  182.   shared_ptr<MaskARound>    maro(rof->CreateFigureA());
  183.   shared_ptr<MaskBRound>    mbro(rof->CreateFigureB());

  184.   shared_ptr<RecFactory>   ref(new RecFactory());
  185.   shared_ptr<MaskARec>    mare(ref->CreateFigureA());
  186.   shared_ptr<MaskBRec>    mbre(ref->CreateFigureB());

  187.   shared_ptr<TriFactory>  tif(new TriFactory());
  188.   shared_ptr<MaskATri>    matr(tif->CreateFigureA());
  189.   shared_ptr<MaskBTri>    mbtr(tif->CreateFigureB());
  190. }
复制代码
abstract factory适用于:
1. 系统独立于产品创建,组合和表示时
2. 系统具有多个产品系列
3. 强调一系列相关产品的设计
4. 使用产品类库,只想显示接口
同时具有一些优缺点:
1. 方便更换产品系列,只要更换factory对象即可。
2. 有利于产品的一致性,每种factory只支持创建一个系列对象。
3. 难以支持新新产品。继承的接口确定了可以被创建的对象集合,有新添加的类型时,必须扩展接口,涉及到所有子类的改变,一个更加灵活但不太安全的方法是参数化创建对象的函数。
Abstract factory大部分情况下是用factory method模式实现的,但是也可以用上篇文章中的prototype模式实现。由于每个factory都负责同一系列对象创建,通常实现为singleton。

回复

使用道具 举报

发表于 2017-5-25 11:37 | 显示全部楼层
好奇真的可以实例化么
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

facebook google plus twitter linkedin youku weibo rss
©2019 Microchip Corporation

小黑屋|手机版|Archiver|Tensilica技术社区

GMT+8, 2019-10-15 13:08 , Processed in 0.079143 second(s), 7 queries , MemCache On.

快速回复 返回顶部 返回列表