问题标签 [factory-method]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
676 浏览

java - 强制子类具有特定的工厂方法或构造函数

我 70% 确信这是不可能的,但是有没有办法确保子类具有特定的构造函数或工厂方法?

在这种情况下,我正在尝试创建一个StringSerializable需要子类具有以下方法的方法

  • toString, 将对象转换为String.
  • fromString,它从 a 中获取一个实例String

显然,在第一种情况下,我可以toString抽象一下。另一方面,有一个非静态的fromString似乎是有问题的。但是,我无法创建抽象静态方法。我也不认为构造函数是完全合适的。

0 投票
1 回答
987 浏览

objective-c - 写工厂方法时使用[[self alloc] init]

[[self alloc] init] 在编写工厂方法时无法理解其用法。我知道工厂方法是创建类实例的便捷方法,它们为您执行allocinitautorelease。我可以看到它是如何形成的,例如在NSArray使用工厂方法arrayWithArray:array等声明属性时调用它来设置它。我显然可以看出这与直接(显式)调用allocand有何不同init

我的问题是我不了解更深层次的工厂方法。我在网上看到了一个解释,它说可以使用类工厂方法来基本上封装这样的东西,而不是显式调用alloc和调用:init

但是如何有效instancetype[self alloc]允许子类使用类工厂方法呢?

0 投票
2 回答
110 浏览

java - IntBuffer(和其他原始类型缓冲区)的工厂方法返回实例,但这些类实际上是抽象定义的

似乎你无论如何都不能创建这个类的实例,因为它声明为抽象但同时,有一个静态工厂方法 IntBuffer allocate(int capacity),现在你可以通过简单地创建一个实例,Buffer b=IntBuffer.allocate(128) 但等待,IntBuffer 是抽象的,它没有任何预定义的具体子类。那么这是如何工作的呢?

编辑 - - - - - - -

我已经怀疑它返回了 IntBuffer 的子类,但是我找不到 HeapIntBuffer 或任何此类子类。我猜是私下宣布的吗??因此它不在 api doc 中!

0 投票
1 回答
1082 浏览

javascript - 如何从angularjs中的另一个服务方法调用工厂方法?

我有一个工厂方法作为..

现在如果我从另一个服务方法调用这个方法..

它显示一个错误..Uncaught TypeError: undefined is not a function。请任何人帮助我解决此错误..

0 投票
2 回答
197 浏览

design-patterns - 抽象工厂:当具体工厂需要额外数据时

考虑以下为记录操作而设计的体系结构Add/Update正在Entity.

LogFactory是一个并通过构造函数Abstract Factory接收两个工厂。混凝土工厂和实施都是为了生产. 他们都需要收集可记录的数据。好吧,我希望一切都清楚,并且您承认到目前为止,模式是正确的解决方案。AddUpdateDIAddLogFactoryUpdateLogFactoryILogFactoryILogEntityAbstract Factory

在此处输入图像描述

问题:

UpdateLogFactory是一个例外,因为它需要额外的数据:ModifiedProperties创建一个之前/之后的字符串(同时它的兄弟,即实现的其他类型ILogFactory不需要这种数据;一个Entity就足够了)。为了不破坏ILogFactory,我决定通过它的构造函数ModifiedProperties给予。UpdateLogFactory它解决了我的问题,但我觉得我在作弊;我假装UpdateLogFactory和别人相似,其实不然。

如果有人想UpdateLogFactory用另一种具体类型替换,他怎么知道它需要ModifiedProperties

0 投票
1 回答
405 浏览

java - 为什么工厂方法声明为受保护?

我正在阅读 Head First Design Patterns 一书,在第 4 章的“声明工厂方法”部分,该方法被声明为受保护:

这让我很困惑,因为我最初认为,实际上这本书中也有说明,拥有一个工厂(方法)可以让你有一个为你创建实例的地方,不仅用于稍后执行操作,还用于“查询”。“采取行动”是指pizza.cut()等,“查询”是指pizza.isSpicy()

关键字不会protected将查询限制为仅子类和相同包类吗?如果第 3 方班级需要在点餐前知道披萨是辣的怎么办?

我可能想多了,因为突出显示框并没有说它必须protected存在,但它在示例代码中。

0 投票
2 回答
49 浏览

php - 具有非抽象产品的方法工厂

我正在实现工厂方法模式,但是检查了几个示例,我无法确定为产品扩展具体类而不是创建抽象类或接口是否正确......这只是一个示例(PHP) .

所以,我有我的抽象工厂和他们的具体工厂:

现在我在所有示例中看到的是,通常产品从抽象类或接口扩展而来,但是当我测试时,我意识到在我的情况下不需要这样做,我需要的是一个具有常见的行为,然后是我的子类和其余的。

类实例化仍然是派生到子类的,所以我真的相信这是一个工厂方法的实现,但是我可以通过这种方式找到另一个示例代码。

所以问题是:这仍然是工厂方法的实现吗?如果不是为什么?

0 投票
0 回答
139 浏览

c++ - 重写模板类以使用继承而不更改需要静态函数调用的调用环境

重写模板类以使用继承而不改变需要静态函数调用的调用环境,但静态函数不能是虚拟的。

我从 C++ 编码测试中遇到了这个问题。实际上,这个问题并没有说得那么清楚,到目前为止我还没有得到解决方案。抱歉有任何歧义。为了帮助任何人更好地理解这个问题。以下是我个人的解读。欢迎指出我的误解。

该模板类是服务端封装的库,客户端调用一些静态函数等API。但是,静态函数不能是虚拟的。换句话说,静态函数不允许动态边界(覆盖)。

  1. 尝试重写一个模板类,这个类使用继承。所以这个类有一个派生类。但是我们不想改变 API 调用环境。换句话说,我们计划在服务器端升级代码,但我们不希望在客户端进行任何代码更改。

  2. 尝试使用继承,重写一个模板类。但是我们不想改变 API 调用环境。换句话说,我们计划在服务器端升级代码,但我们不希望在客户端进行任何代码更改。

我不确定 1 还是 2 是正确的解释。但我更倾向于1。在我看来,这个问题主要是测试的概念

  1. 服务端代码维护
  2. 设计模式,主要针对工厂方法
  3. 在类继承中覆盖静态函数的任何技巧

服务器端的原始代码:

客户端调用环境:

输出:

我是基础班

(显然静态函数没有覆盖)

///////////////////////////////////////// //////////////////////////

我在服务器端重写了代码:

客户端调用环境:

输出:

我是基础班

我是派生类

我的修改:

  1. 为了“覆盖”静态函数,我添加了一个虚拟函数来调用静态函数作为技巧。
  2. 我使用工厂方法从客户端隐藏实例创建。

但我不确定这样的修改是否能满足不改变调用环境的要求。因为我确实在客户端更改了 API 调用。根据我的努力,这是我最好的解决方案。非常感谢任何评论和改进。

0 投票
1 回答
108 浏览

php - 使用工厂方法 DP 处理依赖注入

我们必须实现一个能够创建多个复杂对象的工厂。我们应该如何使用依赖注入来处理它?

我已经在 stackoverflow(和其他地方)中阅读了许多关于它的主题,尤其是 Mark Seemann 的主题,但无法做出任何决定,因此需要您的意见。

例如:

我找到了一些解决方案,但不知道该选择哪一个。

  1. 一个解决方案是,就像在示例中一样,让工厂负责实例化依赖项。

问题:与不使用依赖注入相同。

  1. 另一种是给工厂构造函数提供依赖

问题:构造函数中的参数会很多而且列表会变大

  1. 我也在互联网上找到的第三种解决方案是创建一种构建器而不是事件。工厂负责知道要创建哪种对象,而构建者将知道如何创建它们。

问题:builder DP的角色是处理依赖关系吗?我害怕遇到与解决方案 #1 相同的问题。

我们应该做什么 ?

0 投票
2 回答
52 浏览

java - 将类实现保留在其接口的静态字段中是不是一个坏主意?

我正在做一个项目,我们将实际的类实现保存在接口的静态字段中。一个例子是:

我们这样做是为了避免使用 IoC 框架的复杂性,并避免在我们的代码中添加诸如context.getImpl(Storage.class). 此外,我们这样做也是为了避免引入大型工厂类,我们相信我们可以通过在接口的静态字段中保留实现引用来做到这一点。我们通过这个实现的是,应用程序的任何需要存储东西的部分都可以使用Storage.instance.create(File f).

但是,我们一直在讨论这是否违背了广泛接受的“原则”。首先; 我们是否因为在接口中创建实现依赖而遇到麻烦?严格来说,接口现在对实现有一个直接的“引用”。其次,我们意识到我们的测试不能仅仅“注入”aMemoryDiskStorage或 a MockDiskStorage,因为接口中的静态字段是 final 字段。我们如何解决这个问题?