- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用工厂对象FooFactory
创建 Foo
类型的实例其中有一些私有(private)数据成员。我使用工厂这样一个对象Bar
它创建 Foo
的实例不需要提供(甚至知道)这些私有(private)数据成员:我首先使用必要的私有(private)内容配置工厂,然后给出 Bar
这个配置的工厂。
我要Bar
使用这些Foo
通过接口(interface)的对象,这样我就可以使用 gomock
来模拟它们并测试 Bar
正确使用它们。根据我所读到的关于 go 中接口(interface)的内容,最佳实践是在使用接口(interface)的地方定义接口(interface),而不是在定义底层类型的地方,所以我有一个 Fooer
接口(interface)与我的Bar
在同一个包中对象,以及Bar
使用这个Fooer
任何需要 Foo
的接口(interface)(或稍后, MockFoo
)。
我也想要Bar
使用FooFactory
出于同样的原因通过接口(interface),所以我可以模拟它并断言它创建 Foo
当我期望的时候对象。再次,我在Bar
中定义了一个接口(interface)。 s包FooBuilder
,其中底层 FooFactory
隐式实现。
现在问题是 FooFactory
返回具体Foo
对象,因为它们都在同一个 Foo
中包,不应该知道 Bar
的本地定义的接口(interface)。但是,我想要 FooBuilder
构建 Fooer
类型的对象而不是 Foo
类型的对象因为它不需要了解底层类型。 Go 不允许这样做,因为返回类型不同并且它说 FooFactory
不实现FooBuilder
.
这里是没有上述包结构的最小复制:
type Foo struct{}
func (f *Foo) FooMethod() {}
type FooFactory struct{}
func (ff *FooFactory) Build() *Foo {
return &Foo{}
}
type Fooer interface {
FooMethod()
}
type FooBuilder interface {
Build() Fooer
}
func main() {
f := &Foo{}
ff := &FooFactory{}
var fooer Fooer
var fooBuilder FooBuilder
fooer = f
fooBuilder = ff // << ERROR
}
去提示:
cannot use ff (type *FooFactory) as type FooBuilder in assignment:
*FooFactory does not implement FooBuilder (wrong type for Build method)
have Build() *Foo
want Build() Fooer
我的问题本质上是,我这样做对吗?在拥有专业 C++ 和 Java 背景之后,我试图接受 Go 的隐式接口(interface)满足的概念,但这感觉很奇怪。事实上,这并不容易做到,让我觉得我做错了什么,但我在网上读到的有关 go 接口(interface)的所有内容都说要在靠近使用位置的地方定义接口(interface),这才是我真正想做的.
最佳答案
你的方法是正确的。不过,如果 Foo
的设置并不复杂,我会放弃工厂。
Foo
和 Fooer
可能位于也可能不位于不同的包中。我首先将它们放在同一个包中,直到它不再有意义为止。
我通常设置这些情况的方式是:
package foo
func NewFoo() *Foo {
return &Foo{}
}
type Foo struct{}
func (f *Foo) FooMethod() {}
type Fooer interface {
FooMethod()
}
消费者:
package bar
func FooUser(f Fooer) {
//Do something
}
并将其与以下内容放在一起:
package main
import (
"foo"
"bar"
)
func main() {
f := foo.NewFoo()
bar.FooUser(f)
}
这样您就可以将 foo
包作为一个单元进行测试,并使用任何实现 Fooer
的结构来测试 bar
包。
您会发现很多核心包也是以这种方式构建的。
您缺少的一点是 FooFactory
实际上并未实现 FooBuilder
接口(interface)。
FooBuilder
接口(interface)声明了一个返回 Fooer
的方法,但 FooFactory
的方法签名返回一个指向 Foo
的指针。
func (ff *FooFactory) Build() *Foo
因此,您声明了方法 Build
但返回了错误的类型,因此它不会被识别为实现。
要修复该错误,请将 Build
实现的签名更改为:
func (ff *FooFactory) Build() Fooer
关于go - 使用工厂模式时接口(interface)应该在哪里定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58536878/
我应该执行以下操作: 可能通过服务/工厂,使用 $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
我是一名优秀的程序员,十分优秀!