zoukankan      html  css  js  c++  java
  • 面向对象设计模式之AbstractFactory抽象工厂模式(创建型)

    动机:在软件系统中,经常面临着“系列相互依赖的对象”的创建工作:同时,由于需求的变化,往往存在更多系列对象 的创建工作;如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?
    意图:提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。

    适用性:

    • 一个系统要独立于它的产品的创建、组合和表示时。
    • 一个系统要由多个产品系列中的一个来配置时。
    • 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
    • 当你提供一个产品类库,而只想显示它们的接口而不是实现时

      UML图:

      示例代码:游戏场景中AbstractFactory模式的应用

        1 using System;
        2 using System.Collections.Generic;
        3 using System.Linq;
        4 using System.Text;
        5 
        6 namespace AbstractFactory
        7 {
        8     #region 一系列对象的抽象类定义
        9     /// <summary>
       10     /// 路(抽象类)
       11     /// </summary>
       12     public abstract class Road
       13     { 
       14     
       15     }
       16 
       17     /// <summary>
       18     /// 房屋(抽象类)
       19     /// </summary>
       20     public abstract class Building
       21     { 
       22     
       23     }
       24 
       25     /// <summary>
       26     /// 隧道(抽象类)
       27     /// </summary>
       28     public abstract class Tunnel
       29     { 
       30     
       31     }
       32     /// <summary>
       33     /// 丛林(抽象类)
       34     /// </summary>
       35     public abstract class Jungle
       36     { 
       37     
       38     }
       39     #endregion 
       40 
       41     #region 一系列具体实例对象类的定义
       42    
       43      #region 现代风格的一系列对象
       44     /// <summary>
       45     /// 现代风格的路
       46     /// </summary>
       47     public  class ModernRoad:Road
       48     {
       49 
       50     }
       51 
       52     /// <summary>
       53     /// 现代风格的房屋
       54     /// </summary>
       55     public class ModernBuilding:Building
       56     {
       57 
       58     }
       59 
       60     /// <summary>
       61     /// 现代风格的隧道
       62     /// </summary>
       63     public class ModernTunnel:Tunnel
       64     {
       65 
       66     }
       67     /// <summary>
       68     /// 现代风格的丛林
       69     /// </summary>
       70     public class ModernJungle:Jungle
       71     {
       72 
       73     }
       74     #endregion
       75 
       76      #region 古代风格的一系列类
       77     /// <summary>
       78     /// 古老风格的路
       79     /// </summary>
       80     public class AncientRoad : Road
       81     {
       82 
       83     }
       84 
       85     /// <summary>
       86     /// 古老风格的房屋
       87     /// </summary>
       88     public class AncientBuilding : Building
       89     {
       90 
       91     }
       92 
       93     /// <summary>
       94     /// 古老风格的隧道
       95     /// </summary>
       96     public class AncientTunnel : Tunnel
       97     {
       98 
       99     }
      100     /// <summary>
      101     /// 古老风格的丛林
      102     /// </summary>
      103     public class AncientJungle : Jungle
      104     {
      105 
      106     }
      107     #endregion
      108 
      109     #endregion
      110 
      111     /// <summary>
      112     /// 场景设施抽象创建工厂类
      113     /// </summary>
      114     public abstract class FacilitiesFactory
      115     {
      116         public abstract Road CreateRoad();
      117         public abstract Building CreateBuilding();
      118         public abstract Tunnel CreateTunnel();
      119         public abstract Jungle CreateJungle();
      120     }
      121 
      122     /// <summary>
      123     /// 现代风格的对象创建工厂类
      124     /// </summary>
      125     public class ModernFacilitiesFactory : FacilitiesFactory
      126     {
      127 
      128         public override Road CreateRoad()
      129         {
      130             return new ModernRoad();
      131         }
      132 
      133         public override Building CreateBuilding()
      134         {
      135             return new ModernBuilding();
      136         }
      137 
      138         public override Tunnel CreateTunnel()
      139         {
      140             return new ModernTunnel();
      141         }
      142 
      143         public override Jungle CreateJungle()
      144         {
      145             return new ModernJungle();
      146         }
      147     }
      148 
      149     /// <summary>
      150     /// 古代风格的对象创建工厂类
      151     /// </summary>
      152     public class AncientFacilitiesFactory : FacilitiesFactory
      153     {
      154 
      155         public override Road CreateRoad()
      156         {
      157             return new AncientRoad();
      158         }
      159 
      160         public override Building CreateBuilding()
      161         {
      162             return new AncientBuilding();
      163         }
      164 
      165         public override Tunnel CreateTunnel()
      166         {
      167             return new AncientTunnel();
      168         }
      169 
      170         public override Jungle CreateJungle()
      171         {
      172             return new AncientJungle();
      173         }
      174     }

          客户程序实现代码:
         

       1  /// <summary>
       2     /// 假设此类为客户程序
       3     /// </summary>
       4     public class GameManager
       5     {
       6         /***
       7          * 当需要增加另一种风格的场景时,只需要继承对应的抽象类实现此风格下的实例对象类和具体工厂类即可
       8          * 而客户程序无需改动或改动甚少,这既是这种设计模式的优势
       9          * ***/
      10         FacilitiesFactory _facilitiesfactory;
      11         Road road;
      12         Building building;
      13         Tunnel tunnel;
      14         Jungle jungle;
      15         public GameManager(FacilitiesFactory facilitiesfactory )
      16         {
      17             this._facilitiesfactory = facilitiesfactory;
      18         }
      19 
      20         /// <summary>
      21         /// 创建游戏场景
      22         /// </summary>
      23         public void BuildGameFacilities()
      24         {
      25             road = _facilitiesfactory.CreateRoad();
      26             building = _facilitiesfactory.CreateBuilding();
      27             tunnel = _facilitiesfactory.CreateTunnel();
      28             jungle = _facilitiesfactory.CreateJungle();
      29         }
      30 
      31         /// <summary>
      32         /// 开始游戏
      33         /// </summary>
      34         public void Play()
      35         { 
      36         
      37         }
      38     }
      39 
      40   }
      41 
      42  public class App
      43     {
      44         public static void Main()
      45         {
      46             FacilitiesFactory ff = new ModernFacilitiesFactory();
      47             GameManager game = new GameManager(ff);
      48             game.BuildGameFacilities();
      49             game.Play();
      50         }
      51     }

      注:本示例代码是本人学习Webcast C#面向对象设计模式纵横谈系列讲座视频时,跟着李建忠老师一步一步的编写的,在此奉献出来,仅供大家参考



     

  • 相关阅读:
    触摸屏与usb鼠标同时支持
    QT国际化(lupdate/linguits/lrelease)生成.ts,转换成.qm方法
    Qt5 使用lambda
    c++中lambda表达式的用法
    异或运算的作用
    函数指针和指针函数用法和区别
    前端html页面学习---html部分
    二:maven构建module
    一:使用maven构建项目
    maven项目发布到tomcat后没有lib目录解决方案
  • 原文地址:https://www.cnblogs.com/yja9010/p/3178777.html
Copyright © 2011-2022 走看看