【模式】抽象工厂模式

来源:互联网 发布:ubuntu apt jdk 编辑:程序博客网 时间:2024/04/29 17:55
天跟漏了似的,下了一整天的雨,本来打算和小小去看电影来着,结果被困在家里,哪都去不了~

工厂模式看了好几遍,但是还是总把抽象工厂和工厂方法弄混,blog下来让自己有点记性。
        工厂模式解决这样的问题:
        需要为特定的“客户”提供特定系列的对象,这样一系列相关对象需要被实例化,我们有需要判断在情况A时,实例化对象a;在情况B,实例化对象b。类型A和B很相似,拥有相似的接口,而且完成相似的功能,只不过具体实现有差别——a对象属于A系列中的一种,b对象属于B系列中的一种。A系列有a1对象可以解决C这样的问题,B系列有b1对象也可以解决C问题;A系列有a2可以解决D问题,B系列也有b2可以解决D问题。一种可能的解决办法是用switch-case结构,但是这会造成维护时的负担,扩展性也不好,既要判断是哪种问题,又要判断要用哪种系列。用抽象工厂可以解决这样的问题。
        Abstract Factory模式通过一个抽象类,来指定那些对象将被创建,然后为每一系列对象实现一个具体类。有这些具体类来做实际的工作。这样会对“客户”隐藏具体使用了什么对象,是对象A还是对象B,客户并不了解,客户只需要提供需求,然后由那个抽象类来决定用那种具体类。
        过程是这样的:
                               需要一个显卡驱动       
      1. 客户---------------------------------------------->对象工厂
                                                                                      |
                                                                                      |         创建一个ATI显卡驱动
                                                                                      |
                                                                                 ATI系列
                               给客户一个显卡驱动       
      2. 客户<----------------------------------------------对象工厂
                                                                                     
                                                                                 ATI系列
                                        
      3. 客户                                                                 对象工厂
              |                                                                     
              |          使用这个ATI显卡驱动                                                          
              |                                                                     
              |-------------------------------------------------> ATI系列
                               需要一个主板驱动       
      4. 客户---------------------------------------------->对象工厂
                                                                                      |
                                                                                      |         创建一个ATI主板驱动
                                                                                      |
                                                                                 ATI系列
                               给客户一个主板驱动       
      5. 客户<----------------------------------------------对象工厂
                                                                                     
                                                                                 ATI系列
                                        
      6. 客户                                                                 对象工厂
              |                                                                     
              |          使用这个ATI主板和显卡驱动                                                          
              |                                                                     
              |-------------------------------------------------> ATI系列

        以上其实是一般情况,更隔路的情况在于,客户需要一个Intel主板驱动和一个ATI显卡驱动,那么我们就需要拜托工厂给我们做成这样:(只有4~6,1~3一样)
                                        需要一个主板驱动       
      4. 客户---------------------------------------------->对象工厂
                                                                                      |
                                                                                      |         创建一个Intel主板驱动
                                                                                      |
                                                                                 Intel系列
                               给客户一个主板驱动       
      5. 客户<----------------------------------------------对象工厂
                                                                                     
                                                                                 Intel系列
                                        
      6. 客户                                                                 对象工厂
              |              使用Intel主板驱动                                                       
              |  ------------------------------------------------>Intel系列                                                               
              |              使用ATI显卡驱动                                                       
              |-------------------------------------------------> ATI系列
       
        当问题领域中有不同系列(Intel和ATI)的对象出现,并且每个系列都将被用于不同情况时(又有显卡驱动又有主板驱动),就应该使用Abstract Factory模式。

原创粉丝点击