- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在this中学习工厂模式
关联。在编写了一个普通的工厂之后,作者继续设计一个工厂,我们不必修改工厂的代码来添加新的具体实现。 (假设有一个 Product
接口(interface),工厂提供它的实现)。
为了实现这一目标,作者说:
We add a new abstract method in the product abstract class. Each concrete class will implement this method to create a new object of the same type as itself.
此代码片段如下:
abstract class Product
{
public abstract Product createProduct();
...
}
class OneProduct extends Product
{
...
static
{
ProductFactory.instance().registerProduct("ID1", new OneProduct());
}
public OneProduct createProduct()
{
return new OneProduct();
}
...
}
class ProductFactory
{
public void registerProduct(String productID, Product p) {
m_RegisteredProducts.put(productID, p);
}
public Product createProduct(String productID){
((Product)m_RegisteredProducts.get(productID)).createProduct();
}
}
我这里有一个疑问。我们已经向工厂注册了 OneProduct 的实例。然后在运行时,我们调用 createProduct()
方法,该方法再次创建 Oneproduct
的新实例。
这是正确的做法吗?我们必须在这里创建 OneProduct
的两个实例,我认为这是错误的。
最佳答案
您需要两个实例的原因是,当您调用 createProduct()
时,您正在使用多态性。方法。也就是说,每个具体产品都有自己的 createProduct()
实现,并且您可以使用该方法以相同的方式创建所有它们,因为它们都继承自同一个抽象类。
但要做到这一点,您需要有实例。您不能将多态性与静态方法一起使用。您只能重写实例方法。因此你需要一个实例来创建一个实例。
但是,实例不必与其创建的类型相同。它只需是实现所需方法的类的实例即可。在 Java 8 中,您可能可以使用 Supplier<Product>
获得更干净的解决方案。 .
abstract class Product
{
...
}
class OneProduct extends Product
{
...
static
{
ProductFactory.instance().registerProduct("ID1", OneProduct::new);
}
...
}
class ProductFactory
{
Map<String,Supplier<Product>> m_RegisteredProducts = new HashMap<>();
public void registerProduct(String productID, Supplier<Product> p) {
m_RegisteredProducts.put(productID, p);
}
public Product createProduct(String productID){
// There should be a null check here...
return m_RegisteredProducts.get(productID).get();
}
}
本质上,方法引用为您提供了一个实现 Supplier<Product>
的小对象。 ,您可以调用 get()
,这将使用默认构造函数创建一个新产品。
您提到的文章很旧了。我相信它早于 Java 1.2,因为它仍然使用 Hashtable
而不是现代 map ,也没有泛型。原则保持不变,但有更现代的实现方法。
关于java - 工厂模式: Supporting new concrete types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55107236/
我有一个非常简单的类,如下所示: abstract class Person { private $id; private $createdOn; // ... More pr
我需要在扩展AbstractClass的每个ConcreteClass中定义常量值。由于某种原因,对象最终会具有重复的字段,一组字段等于零,下一组字段具有正确的值。 某些接口(interface) p
在阅读 this article 中的工厂时,我遇到了这两个术语 AbstractFactory 和 ConcreteFactory。 在阅读 StackOverflow 时,我发现了一些很好的答案(
public class GenericClass { class MyClass { } public GenericClass(final T[] param) {
我在同一代码中遇到了另一个问题......我收到此错误: initialization method -initWithCharactersNoCopy:length:freeWhenDone: ca
我在研究 concolic testing 的概念时遇到了术语“具体和符号执行” . (那里提到的文章“CUTE:C 的混合单元测试引擎”在其摘要部分使用了该术语。) "The approach us
我在运行 Streaming API 时遇到了 tweepy 问题,但我的问题不仅仅与 tweepy 直接相关。 我遇到了多个异常,我认为我可以暂时“捕获/通过”,作为临时解决方案,直到找出问题所在。
我想将表单结果写入另一个数据库。 在 Concrete 5.6 中,您可以即时切换到另一个数据库。我无法找出它在 Concrete 5.7 中的工作原理。 5.6 方式 $db = Loader::d
我该怎么做才能防止编译器抛出以下警告 Missing concrete implementation of setter 'MyClass.field' and getter 'MyClass.fie
我们是 Glass mapper 的新手,想在我们的 Sitecore 项目中使用它。在查看教程时,我们注意到没有关于如何设置 Sitecore 允许的深度继承的深入示例。浏览网页时,我们注意到有人将
在自定义 Concrete5 代码 (5.7+) 中执行服务器端重定向的正确方法是什么? 最佳答案 我发现这是最好的方法: (new RedirectResponse('/URL-HERE'))->s
我正在开发一个建筑项目的库存控制系统。保管人负责添加新库存并将其分配给员工或从员工退还。这些项目(以及它们的属性)将有很大的不同。例如钢铁制品,服装,工厂/机械,工具等 我的问题是要使用Class/C
我有类Bar(可能还有许多其他类),它扩展了抽象类AbstractFoo。将 Bar 实例转换为 FooDTO 时,会检测具体类。 但是,当将 Bar 实例集合转换为 FooDTO 列表时,具体的类信
我有一个接口(interface)和一个定义如下的类 public interface IShape { } public class Square : IShape { } 我知道我可以在结构图中为
我正在this中学习工厂模式关联。在编写了一个普通的工厂之后,作者继续设计一个工厂,我们不必修改工厂的代码来添加新的具体实现。 (假设有一个 Product 接口(interface),工厂提供它的实
我有一个“提供者工厂”,它创建具体提供者的实现。要创建正确的实现,除其他参数外,它还需要 typeId。问题是为了将正确的 typeId 传递给工厂,我需要验证并在必要时更改它。为了做到这一点,除其他
在使用模型继承时,我试图找到 django 模型对象的实际类。 一些描述问题的代码: class Base(models.model): def basemethod(self):
我使用 vim 并尝试使用“Vundle”。它有助于像在 Ruby on Rails 中一样安装插件: Bundle 'scrooloose/nerdtree' Bundle 'scrooloose/
我对使用具体类和接口(interface)的影响有一些疑问。 说一些代码块(称之为chunkCode)使用具体类A。如果出现以下情况,我是否必须重新编译 chunkCode: 我向 A 添加了一些新的
所以我遇到了一个问题,我正在尝试实现父级的父级的具体版本,如下所示。 public abstract class Collection { ... } public abstract class
我是一名优秀的程序员,十分优秀!