- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
来源:https://en.wikipedia.org/wiki/Factory_method_pattern
这张图真的暗示了工厂方法模式?
为什么我们需要 Creator?看代码示例:
interface Product{
public String getName();
}
class ConcreteProduct1 implements Product {
@Override
public String getName() {
return "I'm product 1";
}
}
class ConcreteProduct2 implements Product {
@Override
public String getName() {
return "Im product 2!";
}
}
// CREATOR HERE
interface Creator{
public Product createProuct(String productClass);
}
class ConcreteCreator implements Creator{
@Override
public Product createProuct(String productClass) {
if(productClass.equals("1"))
return new ConcreteProduct1();
else if(productClass.equals("2"))
return new ConcreteProduct2();
else
return null; //
}
}
public class Test {
public static void main(String[] args) {
Creator c = new ConcreteCreator();
Product product = c.createProuct("1");
System.out.print(product.getName());
}
}
没有Creator界面的代码:
class ConcreteCreator{
public Product createProuct(String productClass) {
if(productClass.equals("1"))
return new ConcreteProduct1();
else if(productClass.equals("2"))
return new ConcreteProduct2();
else
return null; //
}
}
public class Test{
public static void main(String[] args) {
ConcreteCreator c = new ConcreteCreator();
Product product = c.createProuct("1");
System.out.print(product.getName());
}
}
那么为什么我们需要Creator接口(interface)呢?以防万一我将来添加另一个工厂方法?如果是,它还是工厂方法模式还是抽象工厂模式?您能否给我一些代码示例,其中包含对我的 Creator 接口(interface)的扩展以及使用两种方法的 ConcreteCreator 的实现?
还有通用的 Creator 怎么样?它看起来比许多类型指定的 Creators 简单得多......:
interface Product{
public String getName();
}
class ConcreteProduct implements Product{
@Override
public String getName() {
return "I'm product 1";
}
}
interface Moveable{
public String move();
}
class Car implements Moveable{
@Override
public String move() {
return "moving...";
}
}
interface Creator<T>{
public T create();
}
class ConcreteCreatorProducts implements Creator<Product>{
@Override
public Product create() {
return new ConcreteProduct();
}
}
class ConcreteCreatorCar implements Creator<Car>{
@Override
public Car create() {
return new Car();
}
}
public class Test{
public static void main(String[] args) {
Creator<Product> productCreator = new ConcreteCreatorProducts();
Product product = productCreator.create();
Creator<Car> carCreator = new ConcreteCreatorCar();
Car car = carCreator.create();
}
}
最佳答案
在您的示例中,您不需要 Creator 接口(interface),除非您想要多个实现并在它们之间进行交换。但该图实际上描述的模式与您实现的模式略有不同。
那里描述工厂方法模式的方式是基于原始的设计模式书籍。今天有点奇怪,因为它使用子类来配置类,而我们鼓励使用组合。因此,该图确实显示了工厂方法模式,但与许多其他地方描述的方式不同。
工厂方法模式是:
Define an interface for creating an object, but let subclasses decide which class to instantiate. The Factory method lets a class defer instantiation it uses to subclasses.
在原始模式中,Creator
不是一个接口(interface)。 “接口(interface)”是指 Creator
定义的工厂方法,而不是像 Java 那样的接口(interface)。
工厂方法不需要参数。不是根据参数返回不同的类型,而是根据创建的子类返回不同的类型。
此外,您不会从 main
调用 createProduct
,而是从 Creator
中的方法调用。 Creator
是工厂方法的使用者,所以它定义了一个工厂方法,可能是抽象的,以及一些使用该方法的其他方法。
请参阅维基百科页面上的 Java 示例。 MazeGame
类是 Creator
。构造函数用作anOperation
方法,并且有多个子类用于创建不同类型的房间。
关于java - 工厂方法模式中的创建者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46114484/
Android 中的 Activity Creator 是什么? 最佳答案 activityCreator 是用于创建 Android 项目的批处理文件和 shell 脚本。这早已被 android
我正在使用最新的 Qt SDK (2.4.0) 并且在让 Visual Studio 2008 CDB 正常工作时遇到问题。我遇到了以下两个我认为相关的问题 我有一个失败的断言。当该断言失败时,我会看
源代码 索引.js import React from 'react'; import ReactDOM from 'react-dom'; import App from './App'; impo
我使用 Wifimanager addNetwork() 添加三个配置,然后我想删除这些。 如何获取我的应用创建的配置。 最佳答案 如果我没看错,您需要从您的应用中删除这些添加的 WiFi。 使用 W
我一定是遗漏了一个带有标题和包含的基本概念,因为当我尝试从单独的源文件中调用最简单的函数时,我得到一个错误: main.obj:-1: error: LNK2019: unresolved exter
我想用我用 Qt creator 创建的 Qt 应用程序部署一个崩溃处理程序。经过一番摸索,谷歌的 Breakpd 似乎会完全按照我的需要做,但是关于这方面的教程很简单。因此,我有许多问题希望能得到解
我有一个 Action 创建器,我应该如何用 jest 测试它?问题是,我什至无法进入 Api 函数,这就是为什么我无法获得 LOGIN_SUCCESS,当我检查 store.getState() 时
我有两个计数器:COUNTER_1 和 COUNTER_2。所以我创建了多个 reducer 来处理它们。 export default (state = 0, action) => { switch
如何检查在 Emacs 中创建缓冲区的人的身份,然后再检查是否是同一用户访问该缓冲区?我的意思是“我是谁?”在 Unix 命令中.. 然后检查同一用户是否正在访问该文档? --> 我想要在我自己的代码
如果我有一个包含 5 行和 4 列的表。但我必须在下一行添加值。没有与数据库相关的依赖项。我有 ADD 按钮,我想像每次单击时一样对其进行编码ADD 按钮有新行的添加......我的意思是表中行的创建
我正在尝试制作一个简单的对话框来显示我的名字。看代码。 Pessoa *p = new Pessoa("Ronald Araújo", "ronald.araujo@live.com", 23); Q
我有一些模型,它们之间有 has_many 和 belongs_to 关联,如下所示: class Customer Customer instance end end end 也就是说
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Getting / setting file owner in C# 我搜索了 Internet 但没有找到
我在测试一个 Action 创建者时遇到麻烦,该 Action 创建者只是循环遍历传递给它的数组,并为该数组中的每个项目分配一个 Action 。这很简单,我似乎无法弄清楚。这是 Action 创建者
我使用 redux 和 redux-thunk 来执行异步操作。 在我的组件中,我有以下代码 class Counter extends Component { componentDidMou
假设我有一个 REST API 来编辑用户配置文件。这里涉及到两种方法 一种更新用户个人资料的方法; 获取当前配置文件的完成分数的方法。 当然,当用户更新他的个人资料时,我想获取完成分数。 这是我(天
我有一个 react 组件,我想在 redux 中设置一些状态,当设置状态时,我想在组件中做一些其他的事情。 // Inside Component onButtnClick() {
我有一个带有 Redux 和 Jest 的 create-react-app 用于测试。我正在使用 fetch 从 Action 创建者发出 API 请求。在编写测试时,我发现无论出于何种原因——无论
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
所以我有一个在 QT Creator 中设计的 GUI。 因为我必须添加一个 createWindowContainer 小部件,所以我必须通过 C++ 将一个小部件添加到我的代码中。我正在添加一个简
我是一名优秀的程序员,十分优秀!