工厂方法模式是一种创建型设计模式, 提供一种统一的方式来创建对象, 调用者无需关心具体的构建细节
对象的创建过程被封装在工厂类中, 调用者只需要使用一个共同的接口来获取对象, 不需要直接使用new操作符
这样可以降低客户端和具体产品类之间的耦合度, 提高系统的可扩展性和可维护性
(资料图片)
当一个类不知道或者不关心它需要创建的对象的具体细节时, 可以使用工厂方法模式
例如, 游戏在开始的时候需要创建一个角色, 但是不知道具体要创建哪种角色(如战士、法师、盗贼等, 角色的选择可能是在这个流程开始之前确定下来的), 同样也不知道创建这些对象都需要什么条件, 这种情况下就可以考虑使用工厂方法模式, 让子类工厂(例如战士工厂)来创建角色
类图classDiagram角色<|--战士角色<|--法师角色<|--盗贼角色工厂<|--战士工厂角色工厂<|--法师工厂角色工厂<|--盗贼工厂战士工厂..>战士法师工厂..>法师盗贼工厂..>盗贼角色工厂..>角色class 角色:::role{ +string 角色名称 +跑路()}class 角色工厂{ +创建角色(): 角色}class 战士{ +string 角色名称 +跑路()}class 法师{ +string 角色名称 +跑路()}class 盗贼{ +string 角色名称 +跑路()}class 战士工厂{ +创建角色(): 角色}class 法师工厂{ +创建角色(): 角色}class 盗贼工厂{ +创建角色(): 角色}代码虽然很怪, 但还是先用中文编码吧, 看懂应该不难
定义角色
public abstract class 角色{ protected 角色(string 角色名称) => this.角色名称 = 角色名称; public string 角色名称 { get; set; } public abstract void 跑路();}public class 战士 : 角色{ public 战士() : base("战士") { } public override void 跑路() => Console.WriteLine($"{角色名称}开着野蛮冲锋跑路");}public class 法师 : 角色{ public 法师() : base("法师") { } public override void 跑路() => Console.WriteLine($"{角色名称}开着疾风术跑路");}public class 盗贼 : 角色{ public 盗贼() : base("盗贼") { } public override void 跑路() => Console.WriteLine($"{角色名称}开着潜行跑路");}
然后定义对应的角色工厂
public abstract class 角色工厂{ public abstract 角色 创建角色();}public class 战士工厂 : 角色工厂{ public override 角色 创建角色() => new 战士();}public class 法师工厂 : 角色工厂{ public override 角色 创建角色() => new 法师();}public class 盗贼工厂 : 角色工厂{ public override 角色 创建角色() => new 盗贼();}
如何去使用
角色工厂 工厂 = new 法师工厂();var 玩家角色 = 工厂.创建角色();玩家角色.跑路();工厂 = new 盗贼工厂();玩家角色 = 工厂.创建角色();玩家角色.跑路();
两次跑路
的输出为
法师开着疾风术跑路
盗贼开着潜行跑路
在这种时候可能看不出工厂模式的作用, 下面是一个简单的代码演示
new 山洞副本(new 法师工厂()).危险发生();class 山洞副本{ private 角色 玩家角色; private readonly 角色工厂 工厂; public 山洞副本(角色工厂 工厂) { this.工厂 = 工厂; Init(); } private void Init() { Console.WriteLine("开始初始化"); 玩家角色 = 工厂.创建角色(); Console.WriteLine($"成功加载 {玩家角色.角色名称}"); } public void 危险发生() { Console.WriteLine("出现大群野生篮球"); 玩家角色.跑路(); if (DateTime.Now.DayOfWeek == DayOfWeek.Thursday) { Console.WriteLine("今天是逃不过的肯德基疯狂星期四"); Console.WriteLine($"角色{玩家角色.角色名称} 死亡,重新初始化"); Init(); } else { Console.WriteLine("成功逃脱了!"); } }}
创建副本时传入角色工厂, 初始化副本数据的时候由工厂创建角色, 当危险发生时触发玩家角色的跑路
方法, 如果周四就逃跑失败重新初始化角色, 副本并不需要知道创建角色的细节, 这些细节都被封装在了工厂中
在这种情况下, 即使以后有新增加的角色, 比如平民,游侠什么的, 只需要实现对应的工厂和角色类, 然后在创建副本的时候修改传入的工厂即可
只要副本的业务没有变化就无需更改副本类的代码
X 关闭
2月7日,在北京冬奥会短道速滑男子1000米A...
科技日报合肥2月8日电 (记者吴长锋)8日...
在北京冬奥会自由式滑雪女子大跳台决赛中...
2月8日,当看到中国选手谷爱凌以漂亮的高...
科技日报北京2月8日电 (记者张佳星)记...
人民网北京2月9日电 (记者王连香)记者...
科技日报北京2月8日电 (记者张梦然)据...
科技日报讯 (记者马爱平 通讯员赵鹏跃...
2月2日,海军航空兵某旅组织战备巡逻。刘...
“前方道路遭‘敌’破坏,车辆无法通过。...
Copyright © 2015-2022 青年产业园区网版权所有 备案号:皖ICP备2022009963号-20 联系邮箱:39 60 291 42@qq.com