面向对象设计模式之AbstractFactory抽象工厂模式(创建型)
来源:互联网 发布:微信导航源码 编辑:程序博客网 时间:2024/05/16 16:22
动机:在软件系统中,经常面临着“系列相互依赖的对象”的创建工作:同时,由于需求的变化,往往存在更多系列对象 的创建工作;如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?
意图:提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。
适用性:
UML图:
示例代码:游戏场景中AbstractFactory模式的应用
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace AbstractFactory{ #region 一系列对象的抽象类定义 /// <summary> /// 路(抽象类) /// </summary> public abstract class Road { } /// <summary> /// 房屋(抽象类) /// </summary> public abstract class Building { } /// <summary> /// 隧道(抽象类) /// </summary> public abstract class Tunnel { } /// <summary> /// 丛林(抽象类) /// </summary> public abstract class Jungle { } #endregion #region 一系列具体实例对象类的定义 #region 现代风格的一系列对象 /// <summary> /// 现代风格的路 /// </summary> public class ModernRoad:Road { } /// <summary> /// 现代风格的房屋 /// </summary> public class ModernBuilding:Building { } /// <summary> /// 现代风格的隧道 /// </summary> public class ModernTunnel:Tunnel { } /// <summary> /// 现代风格的丛林 /// </summary> public class ModernJungle:Jungle { } #endregion #region 古代风格的一系列类 /// <summary> /// 古老风格的路 /// </summary> public class AncientRoad : Road { } /// <summary> /// 古老风格的房屋 /// </summary> public class AncientBuilding : Building { } /// <summary> /// 古老风格的隧道 /// </summary> public class AncientTunnel : Tunnel { } /// <summary> /// 古老风格的丛林 /// </summary> public class AncientJungle : Jungle { } #endregion #endregion /// <summary> /// 场景设施抽象创建工厂类 /// </summary> public abstract class FacilitiesFactory { public abstract Road CreateRoad(); public abstract Building CreateBuilding(); public abstract Tunnel CreateTunnel(); public abstract Jungle CreateJungle(); } /// <summary> /// 现代风格的对象创建工厂类 /// </summary> public class ModernFacilitiesFactory : FacilitiesFactory { public override Road CreateRoad() { return new ModernRoad(); } public override Building CreateBuilding() { return new ModernBuilding(); } public override Tunnel CreateTunnel() { return new ModernTunnel(); } public override Jungle CreateJungle() { return new ModernJungle(); } } /// <summary> /// 古代风格的对象创建工厂类 /// </summary> public class AncientFacilitiesFactory : FacilitiesFactory { public override Road CreateRoad() { return new AncientRoad(); } public override Building CreateBuilding() { return new AncientBuilding(); } public override Tunnel CreateTunnel() { return new AncientTunnel(); } public override Jungle CreateJungle() { return new AncientJungle(); } } /// <summary> /// 假设此类为客户程序 /// </summary> public class GameManager { /*** * 当需要增加另一种风格的场景时,只需要继承对应的抽象类实现此风格下的实例对象类和具体工厂类即可 * 而客户程序无需改动或改动甚少,这既是这种设计模式的优势 * ***/ FacilitiesFactory _facilitiesfactory; Road road; Building building; Tunnel tunnel; Jungle jungle; public GameManager(FacilitiesFactory facilitiesfactory ) { this._facilitiesfactory = facilitiesfactory; } /// <summary> /// 创建游戏场景 /// </summary> public void BuildGameFacilities() { road = _facilitiesfactory.CreateRoad(); building = _facilitiesfactory.CreateBuilding(); tunnel = _facilitiesfactory.CreateTunnel(); jungle = _facilitiesfactory.CreateJungle(); } /// <summary> /// 开始游戏 /// </summary> public void Play() { } } }
客户程序调用:
public class App { public static void Main() { FacilitiesFactory ff = new ModernFacilitiesFactory(); GameManager game = new GameManager(ff); game.BuildGameFacilities(); game.Play(); } }
注:本示例代码是本人学习Webcast C#面向对象设计模式纵横谈系列讲座视频时,跟着李建忠老师一步一步的编写的
,在此奉献出来,仅供大家参考
- 面向对象设计模式之AbstractFactory抽象工厂模式(创建型)
- C#面向对象设计模式纵横谈3 AbstractFactory抽象工厂模式创建型模式
- 对象创建型之AbstractFactory(抽象工厂模式)
- 设计模式(三)抽象工厂模式(AbstractFactory)-创建型
- 创建型模式之抽象工厂模式(AbstractFactory)
- 设计模式--创建型-AbstractFactory(抽象工厂)
- java设计模式之创建型模式-抽象工厂(AbstractFactory)
- 设计模式之抽象工厂模式(AbstractFactory)
- 设计模式-创建型模式#抽象工厂AbstractFactory
- 设计模式-创建型模式:抽象工厂 AbstractFactory
- 设计模式(4)--AbstractFactory(抽象工厂模式)--创建型
- 设计模式C++之七(AbstractFactory抽象工厂模式)
- 【2】设计模式之抽象工厂模式(AbstractFactory)
- C#设计模式之抽象工厂(AbstractFactory)
- C#设计模式之抽象工厂(AbstractFactory)
- C#设计模式之抽象工厂(AbstractFactory)
- C#设计模式之抽象工厂(AbstractFactory)
- C#设计模式之抽象工厂(AbstractFactory)
- J2SE在线中文API
- Javascript中面向对象编程
- typedef的应用
- Android学习笔记技巧之给文本加边框
- Android Parcelable的使用
- 面向对象设计模式之AbstractFactory抽象工厂模式(创建型)
- 1, 基础培训----Datasort
- SSH开发环境搭建
- 去掉 powerDesigner 中表设计时的 name和code联动的功能
- Linux中configure/makefile的用法
- 在Centos 5.2中编译内核3.0.0
- opensips相关版本
- Extjs 甘特图自定义任务树代码
- Linux SVN 命令详解