游戏设计--经典文档-C#23种设计模式.pdf
《游戏设计--经典文档-C#23种设计模式.pdf》由会员分享,可在线阅读,更多相关《游戏设计--经典文档-C#23种设计模式.pdf(248页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、c#23种 设 计 模 式 China Document 4 Colors1.1 节 工 期 How are you1.1.1 完 成 日 期 12节 创 建 型 模 式 12.1 单 件 模 式(Singleton Pattern)动 机(M o tiv a tio n):在 软 件 系 统 中,经 常 有 这 样 一 些 特 殊 的 类,必 须 保 证 它 们 在 系 统 中 只 存 在 一 个 实 例,才 能 确 保 它 们 的 逻 辑 正 确 性、以 及 良 好 的 效 率。如 何 绕 过 常 规 的 构 造 器,提 供 一 种 机 制 来 保 证 一 个 类 只 创 建 一 个 实
2、例?这 应 该 是 类 设 计 者 的 责 任,而 不 是 类 使 用 者 的 责 任。结 构 图:意 图:保 证 一 个 类 仅 有 一 个 实 例,并 提 供 一 个 访 问 它 的 全 局 访 问 点。-G。F生 活 的 例 子:适 用 性:(1)当 类 只 能 有 一 个 实 例 而 且 客 户 可 以 从 一 个 众 所 周 知 的 访 问 点 访 问 它 时。(2)当 这 个 唯 一 实 例 应 该 是 通 过 子 类 化 可 扩 展 的,并 且 客 户 应 该 无 需 更 改 代 码 就 能 使 用 一 个扩 展 的 实 例 时。代 码 实 现:(1)单 线 程 S in g l
3、e to n实 现 class SingleThread_Singleton(private static SingleThread_Singleton instance=null;private SingleThread_Singleton()public static SingleThread_Singleton Instance(get(if(instance=null)(instance=new SingleThread_Singleton();)return instance;)以 上 代 码 在 单 线 程 情 况 卜 不 会 出 现 任 何 问 题。但 是 在 多 线 程 的 情
4、 况 下 却 不 是 安 全 的。如 两 个 线 程 同 时 运 行 到 if(instance=null)判 断 是 否 被 实 例 化,一 个 线 程 判 断 为 True后,在 进 行 创 建 instance=new SingleThread_Singleton();之 前,另 一 个 线 程 也 判 断(instance=null),结 果 也 为 True.这 样 就 就 违 背 了 Singleton模 式 的 原 则(保 证 一 个 类 仅 有 一 个 实 例)。怎 样 在 多 线 程 情 况 下 实 现 Singleton?(2)多 线 程 S ingleton实 现:1 c
5、lass MultiThread_Singleton2 3 private static volatile MultiThread_Singleton instance=null;4 private static object lockHelper=new object();5 private MultiThread_Singleton()6 public static MultiThread_Singleton Instance7(8 get9 10 if(instance=null)11 12 lock(lockHelper)13 14 if(instance=null)15 16 ins
6、tance=new MultiThread_Singleton();17)18)19)20 return instance;21)22)23此 程 序 对 多 线 程 是 安 全 的,使 用 了 一 个 辅 助 对 象 lockHelper,保 证 只 有 一 个 线 程 创 建 实 例(如 果 instance 为 空,保 证 只 有 一 个 线 程 instance=new MultiThread_Singleton();创 建 唯 的 一 个 实 例)。(Double Check)请 注 意 一 个 关 键 字 vo la tile,如 果 去 掉 这 个 关 键 字,还 是 有 可 能
7、 发 生 线 程 不 是 安 全 的。volatile保 证 严 格 意 义 的 多 线 程 编 译 器 在 代 码 编 译 时 对 指 令 不 进 行 微 调。(3)静 态 S in g le to n实 现 3 class Static_Singleton4 5 publicstatic readonly Static_Singleton instance=new Static_Singleton();6 private Static_Singleton()7)以 上 代 码 展 开 等 同 于 1 class Static_Singleton2 3 public static reado
8、nly Static_Singleton instance;4 static Static_Singleton()5 6 instance=new Static_Singleton();7)8 private Static_Singleton()9)由 此 可 以 看 出,完 全 符 合 Singleton的 原 则。优 点:简 洁,易 懂 缺 点:不 可 以 实 现 带 参 数 实 例 的 创 建 122 抽 象 工 程 模 式(Abstract Factory)常 规 的 对 象 创 建 方 法:创 建 一 个 Road对 象 Road road=new Road();n e w 的 问
9、题:实 现 依 赖,不 能 应 对“具 体 实 例 化 类 型”的 变 化。解 决 思 路:封 装 变 化 点 哪 里 变 化,封 装 哪 里 潜 台 词:如 果 没 有 变 化,当 然 不 需 要 额 外 的 封 装!工 厂 模 式 的 缘 起 变 化 点 在“对 象 创 建”,因 此 就 封 装“对 象 创 建”面 向 接 口 编 程 一 一 依 赖 接 口,而 非 依 赖 实 现 最 简 单 的 解 决 方 法:1 class Road Fact ory2 public static Road CreateRoad()3(4 return new Road();5)6)7 创 建 一 个
10、 Road对 象 8 Road road=roadFactory.CreateRoad();创 建 一 系 列 相 互 依 赖 对 象 的 创 建 工 作:假 设 一 个 游 戏 开 场 景:我 们 需 要 构 造 道 路、房 屋、地 道,从 林 等 等 对 象 工 厂 方 法 如 下:1 class RoadFactory2(3 public static Road CreateRoad()4 5 return new Road();6)7 public static Building CreateBuilding()8 9 return new BuildingO;10)1 1 publi
11、c static Tunnel CreateTunnel()12 13 return new Tunnel();14)15 public static Jungle CreateJungle()16 17 return new Jungle();18)19 调 用 方 式 如 下:1 Road road=RoadFactory.CreateRoad();3 Building building=RoadFactory.CreateBuilding();4 Tunnel tunnel=RoadFactory.CreateTunnel();5 Jungle jungle=Road Factory.C
12、reate Ju ng le();如 上 可 见 简 单 工 厂 的 问 题:不 能 应 对“不 同 系 列 对 象 的 变 化。比 如 有 不 同 风 格 的 场 景-对 应 不 同 风 格 的 道 路,房 屋、地道.如 何 解 决:使 用 面 向 对 象 的 技 术 来 封 装 变 化 点。动 机(M o tiv a te):在 软 件 系 统 中,经 常 面 临 着 一 系 统 相 互 依 赖 的 对 象 的 创 建 工 作:同 时,由 于 需 求 的 变 化,往 往 存 在 更 多 系 列 对 象 的 创 建 工 作。如 何 应 对 这 种 变 化?如 何 绕 过 常 规 的 对 象
13、创 建 方 法(new),提 供 种 封 装 机 制 来 避 免 客 户 程 序 和 这 种 多 系 列 具 体 对 象 创 建 工 作 的 紧 耦 合?意 图(I n te n t):提 供 一 个 创 建 一 系 列 相 关 或 相 互 依 赖 对 象 的 接 口,而 无 需 指 定 它 们 具 体 的 类。-设 计 模 式 G0F结 构 图(S tru c t):适 用 性:1.一 个 系 统 要 独 立 于 它 的 产 品 的 创 建、组 合 和 表 示 时。2.一 个 系 统 要 由 多 个 产 品 系 统 中 的 一 个 来 配 置 时。3.当 你 要 强 调 一 系 列 相 关
14、的 产 品 对 象 的 设 计 以 便 进 行 联 合 使 用 时。4.当 你 提 供 一 个 产 品 类 库,而 只 想 显 示 它 们 的 接 口 不 是 实 现 时。生 活 例 子:结 构 图 代 码 实 现:1 abstract class Abstract Factory2 3 public abstract AbstractProductA CreateProductA();4 public abstract Abstract Products CreateProductB();5)1 abstract class AbstractProductA2(3 public abstra
15、ct void Interact(Abstract ProductB b);4)1 abstract class AbstractProductB2(3 public abstract void Interact(Abstract ProductA a);4)1 class Client2(3 private AbstractProductA AbstractProductA;4 private AbstractProductB AbstractProductB;5 public Client(Abstract Factory factory)6789101 11213141512345678
16、9101 1123456789101 1Abstract ProductA=factory.CreateProductA();Abstract ProductB=factory.CreateProductB();)public void Run()(Abstract ProductB.Interact(Abstract ProductA);Abstract ProductA.Interact(Abstract ProductB);)class ConcreteFactoryl:Abstract Factorypublic override AbstractProductA CreateProd
17、uctA()(return new ProductAI();)public override AbstractProductB CreateProductB()(return new ProductBI();)class Concret eFactory 2:Abstract Factory(public override AbstractProductA CreateProductA()(return new ProdcutA2();)public override AbstractProductB CreateProductB()(return new ProductB2();)1 cla
18、ss ProductAI:AbstractProductA23 public override void Interact(Abstract Product B b)45 Console.WriteLine(this.GetType().Name+interact with+b.GetType().Name);6)7 1 class ProductBI:AbstractProductB2 3 public override void Interact(AbstractProductA a)4 5 Console.WriteLine(this.GetType().Name+interact wi
19、th+a.GetType().Name);6)7 1 class ProdcutA2:AbstractProductA2 3 public override void Interact(AbstractProductB b)4 5 Console.WriteLine(this.GetType().Name+interact with+b.GetType().Name);6)7)1 class ProductB2:AbstractProductB2 3 public override void lnteract(AbstractProductA a)4 5 Console.WriteLine(t
20、his.GetType().Name+Interact with+a.GetType().Name);6)7 1 public static void Main()2 3/Abstractfactoryl4 Abstract Factory factoryl=new ConcreteFactoryl();5 Client c1=new Client(factory1);6 c1.Run();7/Abstractfactory28 Abstract Factory factory2=new ConcreteFactory2();9 Client c2=new Client(factory2);1
21、0 c2.Run();11)A bstract Factory 注 意 的 几 点:如 果 不 存 在”多 系 列 对 象 创 建 的 需 求 变 化,则 没 必 要 应 用 Abstract Factory模 式,静 态 工 厂 方 法 足 矣。系 列 对 象”指 的 是 这 些 对 象 之 间 有 相 互 依 赖、或 作 用 的 关 系。例 如 游 戏 开 发 场 景 中 的 道 路 与 房 屋 依 赖,“道 路”与“地 道”的 依 赖。A bstract F a c to ry模 式 主 要 在 于 应 对 新 系 列”的 需 求 变 动。其 缺 点 在 于 难 以 应 对”新 对 象“
22、的 需 求 变 动。A bstract F a c to ry模 式 经 常 和 Factory M e th o d模 式 共 同 组 合 来 应 对 对 象 创 建”的 需 求 变 化 12.3 建 造 者 模 式(Builder)B uilder模 式 的 缘 起:假 设 创 建 游 戏 中 的 一 个 房 屋 House设 施,该 房 屋 的 构 建 由 儿 部 分 组 成,且 各 个 部 分 富 于 变 化。如 果 使 用 最 直 观 的 设 计 方 法,每 一 个 房 屋 部 分 的 变 化,都 将 导 致 房 屋 构 建 的 重 新 修 正 动 机(M otivation):在
23、软 件 系 统 中,有 时 候 面 临 一 个“复 杂 对 象”的 创 建 工 作,其 通 常 由 各 个 部 分 的 子 对 象 用 一 定 算 法 构 成;由 于 需 求 的 变 化,这 个 复 杂 对 象 的 各 个 部 分 经 常 面 临 着 剧 烈 的 变 化,但 是 将 它 们 组 合 到 一 起 的 算 法 却 相 对 稳 定。如 何 应 对 种 变 化 呢?如 何 提 供 种“封 装 机 制”来 隔 离 出“笈 杂 对 象 的 各 个 部 分 的 变 化,从 而 保 持 系 统 中 的 稳 定 构 建 算 法 不 随 需 求 的 改 变 而 改 变?意 图(I n te n t
24、):将 一 个 复 杂 对 象 的 构 建 与 其 表 示 相 分 离,使 得 同 样 的 构 建 过 程 可 以 创 建 不 同 的 表 示。.设 计 模 式 GOF结 构 图(Struct):Director Builder协 作(C o lla b o ra tio n s):aClientXaDirectoraConcreteBuildernew ConcreleBuitdernew DireclorfaCorKreleBuikJer)Construct,):2BuiWPaBuikJPartBOBuiklPartCOGetResultOT生 活 中 的 例 子:E 葬 铸 E G 工适
25、 用 性:1.当 创 建 复 杂 对 象 的 算 法 应 该 独 立 于 该 对 象 的 组 成 部 分 以 及 它 们 的 装 配 方 式 时。2.当 构 造 过 程 必 须 允 许 被 构 造 的 对 象 有 不 同 的 表 示 时。实 例 代 码:Builder 类:1 public abstract class Builder23 public abstract void BuildDoor();4 public abstract void BuildWall();5 public abstract void BuildWindows();6 public abstract void
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 游戏 设计 经典 文档 C# 23 模式
限制150内