- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
工厂方法模式是一种 创建型 设计模式, 提供一种统一的方式来创建对象, 调用者无需关心具体的构建细节 。
对象的创建过程被封装在工厂类中, 调用者只需要使用一个共同的接口来获取对象, 不需要直接使用new操作符 。
这样可以降低客户端和具体产品类之间的耦合度, 提高系统的可扩展性和可维护性 。
当一个类不知道或者不关心它需要创建的对象的具体细节时, 可以使用工厂方法模式 。
例如, 游戏在开始的时候需要创建一个角色, 但是不知道具体要创建哪种角色(如战士、法师、盗贼等, 角色的选择可能是在这个流程开始之前确定下来的), 同样也不知道创建这些对象都需要什么条件, 这种情况下就可以考虑使用工厂方法模式, 让子类工厂(例如战士工厂)来创建角色 。
虽然很怪, 但还是先用中文编码吧, 看懂应该不难 。
定义角色 。
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("成功逃脱了!");
}
}
}
创建副本时传入角色工厂, 初始化副本数据的时候由工厂创建角色, 当危险发生时触发玩家角色的 跑路 方法, 如果周四就逃跑失败重新初始化角色, 副本并不需要知道创建角色的细节, 这些细节都被封装在了工厂中 。
在这种情况下, 即使以后有新增加的角色, 比如平民,游侠什么的, 只需要实现对应的工厂和角色类, 然后在创建副本的时候修改传入的工厂即可 。
只要副本的业务没有变化就无需更改副本类的代码 。
最后此篇关于设计模式-工厂方法模式的文章就讲到这里了,如果你想了解更多关于设计模式-工厂方法模式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我应该执行以下操作: 可能通过服务/工厂,使用 $q(异步)查询 API 以获取大型名称数据集 有另一个服务(也是异步的),它应该只返回上述工厂的元素,如果它们与某个字符串(搜索字段)匹配。目的是缩小
我有一个通用的基类。我有一个实现基类的具体类。 我将如何创建工厂类/方法来交付不同类型的具体类? 举个例子: public class ReceiverBase where T : IInte
我正在查看以下链接中的 Ninject Factory 扩展: http://www.planetgeek.ch/2011/12/31/ninject-extensions-factory-intro
工厂、提供商和服务这三个术语之间有什么区别? 刚刚了解 NHibernate 及其存储库模式(POCO 类等)。 最佳答案 工厂:通过将一堆位组合在一起或基于某种上下文选择类型来组装类 Provide
使用CGLIB我可以做到 final var enhancer = new Enhancer(); enhancer.setUseCache(false); enhancer.setSuperclas
我试图在 Kotlin 中使用伴随对象工厂方法(相当于 Java 中的静态工厂方法)创建一个嵌套内部类。这是我的代码的简化版本。 class OuterClass { var myData:L
我正在为我的大学做一个项目,但遇到了问题。 基本上,该项目由一个客户端-服务器应用程序组成,我想创建一个用于通信的 Packet 类。数据包由 header 和主体组成。现在问题来了。我可以有一些不同
这个问题在这里已经有了答案: Why doesn't polymorphism work without pointers/references? (6 个答案) What is object sl
我正在制作一个套接字工厂。我希望每个外部应用程序都使用 Socket 类的接口(interface),它是几个类(ServerSocketTCP、ClientSocketTCP、ServerSocke
我是 angularjs 的新手,我正在尝试创建一个小型电影数据库。这是我第一次使用工厂,我想确保这是正确的方法,以及如何在另一个功能中使用这个工厂,如下所示? 我希望这个工厂只运行一次,这样我就可以
这个问题在这里已经有了答案: Java inner class and static nested class (28 个答案) 关闭 5 年前。 public class DataFactory
我看过很多关于 C++ 工厂的帖子,但到目前为止我还没有看到解决我的问题的解决方案。 (虽然我可能遗漏了一些东西。) 示例控制台应用程序: #include #include #include
这是一个简单的 C++ 项目,有 2 种设计模式:单例和工厂,sigleton 也是一个模板化类,一个接口(interface) (IHash) 和一个类 (Hash1)。一个简单的工厂类 (Hash
这个问题类似于Factory and generics ,并且可能有相同的答案,但它是不同的。我有一个通用基类,它将由完全独立的 JAR 中的类进行扩展。所述 JAR 应该能够在不更改任何其他代码的情
问题是我需要为传递的类创建一个新实例 有没有办法重写这个函数,让它可以接受任意数量的参数? function createInstance(ofClass, arg1, arg2, arg3, ...
我想用简单的 C++ 语法创建一个简单的工厂方法: void *createObject(const char *str,...) { if(!strcmp("X",str)) retu
经过大约 10 个月的程序化 PHP 学习后,我现在正尝试着手研究基本的 OOP 原则和设计模式。这是一个爱好,我没有那么多时间去追求它,所以请原谅这个问题的水平很低。 我的网站(目前 100% 程序
我有一个简单的问题。 我如何编写一个工厂来定义使用 make() 或 create() 的关系,具体取决于原始调用 make() 还是 create()? 这是我的用例: 我有一个简单的工厂 /**
我正在尝试在延迟加载模块中提供 APP_BASE_HREF 注入(inject) token ,然而,工厂方法根本没有被调用。 在这里https://github.com/MaurizioCascia
我有以下 ast: import { factory as f } from 'typescript' const typeDeclaration = f.createTypeAliasDeclara
我是一名优秀的程序员,十分优秀!