- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的项目中实现了一个工厂,最近有人建议我在我的类上使用属性,这样工厂就可以确定要实例化和传回哪个类。我是开发领域的新手,并试图严格遵循松耦合规则,我想知道依赖“钩子(Hook)”(作为属性)是否违背了这一点?
最佳答案
装饰工厂的产品类可以使开发更容易,这也是我有时做的事情。例如,当必须根据存储在数据库中的唯一标识符创建产品时,这尤其有用。该唯一 ID 和产品类别之间必须存在映射,并且使用属性可以使这一点变得非常清晰和可靠。除此之外,它还允许您添加产品类,而无需更改工厂。
例如,你可以这样装饰你的类:
[ProductAttribute(1)]
public class MyFirstProduct : IProduct
{
}
[ProductAttribute(2)]
public class MySecondProduct : IProduct
{
}
你可以像这样实现你的工厂:
public class ProductFactory : IProductFactory
{
private static Dictionary<int, Type> products =
new Dictionary<int, Type>();
static ProductFactory()
{
// Please note that this query is a bit simplistic. It doesn't
// handle error reporting.
var productsWithId =
from type in
Assembly.GetExecutingAssembly().GetTypes()
where typeof(IProduct).IsAssignableFrom(type)
where !type.IsAbstract && !type.IsInterface
let attributes = type.GetCustomAttributes(
typeof(ProductAttribute), false)
let attribute = attributes[0] as ProductAttribute
select new { type, attribute.Id };
products = productsWithId
.ToDictionary(p => p.Id, p => p.type);
}
public IProduct CreateInstanceById(int id)
{
Type productType = products[id];
return Activator.CreateInstance(productType) as IProduct;
}
}
完成此操作后,您可以使用该工厂来创建这样的产品:
private IProductFactory factory;
public void SellProducts(IEnumerable<int> productIds)
{
IEnumerable<IProduct> products =
from productId in productIds
select factory.CreateInstanceById(productId);
foreach (var product in products)
{
product.Sell();
}
}
例如,我过去曾使用这个概念来创建基于数据库标识符的发票计算。该数据库包含每种发票类型的计算列表。实际计算是在 C# 类中定义的。
关于c# - 我可以使用属性让我的工厂知道它可以/应该在不违反 "Loosely-Coupled"规则的情况下实例化什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4387573/
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 3年前关闭。 Improve this
介绍代码: public interface Course { /** * returns the number of units (hours) a specific course
我正在尝试“耦合”NSWindows。 我的意思是 2 个大小相同、并排放置的 NSWindows。如果我移动其中一个,另一个也必须移动以保持两者并排。 我尝试对子窗口执行此操作,但是当移动子窗口时,
它们矛盾吗? 解耦是一件伟大但很难实现的事情。然而,在大多数应用程序中,我们并不真正需要它,所以我可以设计高度耦合的应用程序,它几乎不会改变任何明显的副作用,例如“你不能分离组件”,“单元测试是痛苦的
#include #include #include #include struct s_A { bool bin; s_A(): bin(0) {} }; class c_A
我正在制作一个简单的 3D CAD 软件。在类图中,许多对象需要通过(x,y,z)来与其他对象区分。我创建了一个所谓的“Position”类,但问题是它看起来高度耦合,因为许多类都与位置一起工作。有什
我喜欢以函数式风格进行编程。但我突然想到,将函数作为参数传递有时可能会在组件之间产生比使用非函数参数传递更强的耦合。 例如,在下面的(人为的)示例中:A、B 和 C 通过 C 的函数参数的输出类型、C
我似乎无法理解“松散耦合”的概念。我认为“松散”这个词通常具有负面含义,这没什么帮助,所以我总是忘记松散耦合是一件好事。 有人可以展示一些“之前”和“之后”代码(或伪代码)来说明这个概念吗? 最佳答案
我在理解低耦合和高内聚这句话时遇到问题。我用谷歌搜索并阅读了很多相关内容,但仍然发现很难理解。 据我了解,高内聚意味着我们应该拥有专门执行特定功能的类。希望这是正确的吗?就像信用卡验证类一样,专门用于
所以我的前端页面需要来自促销、产品、制造商和零售商服务的数据——当然每个数据都包含一个后端 API 我应该... A) 在前端(对每个服务)进行 4 个单独的调用以从 4 个位置获取数据? 或者 B)
好的,我不确定耦合是否真正描述了我的问题。问题是,我正在创建自己的基于食人魔的 3d 游戏引擎。我也在使用物理库 PhysX,但由于我需要在我的主引擎代码和 PhysX 之间创建一个抽象层——以防万一
我有一个 GUI,它根据 slider 值向 Web 服务器发出命令。其中一些 slider 在 Web 服务器上“耦合”,因此更改其中一个可能也会更改另一个。耦合是通过网络服务器返回一个值列表来完成
我在我的项目中实现了一个工厂,最近有人建议我在我的类上使用属性,这样工厂就可以确定要实例化和传回哪个类。我是开发领域的新手,并试图严格遵循松耦合规则,我想知道依赖“钩子(Hook)”(作为属性)是否违
情侣数据库配置文件录入,这将是保存数据的最佳方式。此外,数据将通过 php 编码检索,如果可以使用一个理想的查询代码将其关闭。 在 site_member 表中为每个字段创建多个字段...例如:m_f
我在我的应用程序中遇到用户唯一性对的问题... 我有用户女巫可以链接到一些联系人。我使用关系表来做我的链接(女巫也有一个级别属性 - 用于不同级别的关系) 所以我有用户、联系人和关系。我的问题是这对
在使用元类崩溃后,我深入研究了 Python 中的元编程主题,我有几个问题,恕我直言,可用文档中没有明确回答。 在元类中同时使用 __new__ 和 __init__ 时,它们的参数必须定义相同吗?
dismissViewControllerAnimated:completion: 在我的应用程序中工作正常,除了解雇之间的延迟。 [api loginWithUsername:[dict objec
你能给我解释一下下面的短语(摘自 an answer to Stack Overflow question What are the differences between Deferred, Pro
我正在开发一个 WordPress 插件,并努力确保最佳实践。我有两个类,我的插件类“Jargonaut”是必需的,然后是另一个名为“Dictionary”的类,它随 require_once() 包
早在 12 月,就有 this post答案是“可以使用具体类型 [用于简单对象]”。 但是我不断在示例项目中看到越来越多的带有接口(interface)的简单实体,甚至是我刚刚控制的非常大的企业应用
我是一名优秀的程序员,十分优秀!