Questions tagged «design-patterns»

设计模式是解决软件设计中常见问题的通用可重用解决方案。当您对设计模式的实现有疑问时,请使用此标签来提问。请不要在有关文本模式匹配的问题上使用此标签。当在实现上遇到重磅问题时使用此标记-标记实现所使用的代码语言。


28
依赖注入与工厂模式
引用依赖注入的大多数示例,我们也可以使用工厂模式来解决。看起来在使用/设计时,依赖项注入和工厂之间的差异变得模糊或稀薄。 曾经有人告诉我,您如何使用它与众不同! 我曾经使用StructureMap一个DI容器来解决问题,后来我对其进行了重新设计以使其与简单的工厂一起工作,并删除了对StructureMap的引用。 谁能告诉我它们之间的区别以及在哪里使用什么,这里的最佳做法是什么?

10
为什么要创建“隐式展开的可选项”,因为这意味着您知道存在价值?
为什么只创建一个正则变量或常量而不是创建一个“隐式展开的可选”?如果您知道可以成功解包,那么为什么首先要创建一个可选的?例如,为什么这样: let someString: String! = "this is the string" 比以下内容更有用: let someString: String = "this is the string" 如果“可选参数指示允许常量或变量具有'无值'”,但“有时从程序的结构中可以看出,可选参数在首次设置该值后将始终具有一个值”,这是什么意思呢?首先使它成为可选项?如果您知道可选值总是会有一个值,那不是使它不是可选值吗?

10
ViewPager和片段—存储片段状态的正确方法是什么?
片段对于将UI逻辑分为一些模块来说似乎非常好。但是随着ViewPager它的生命周期,我仍然迷茫。因此,非常需要大师的想法! 编辑 请参阅下面的愚蠢解决方案;-) 范围 主要活动有一个ViewPager带有片段。这些片段可以为其他(子主)活动实现一些不同的逻辑,因此片段的数据通过活动内部的回调接口填充。并且所有功能在首次启动时都正常,但是! 问题 重新创建活动时(例如,在方向更改时),ViewPager的片段也是如此。代码(您将在下面找到)说,每次创建活动时,我都会尝试创建一个ViewPager与片段相同的新片段适配器(也许是问题所在),但是FragmentManager已经将所有这些片段存储在某个地方(哪里?),并且为这些人启动娱乐机制。因此,重新创建机制通过我的回调接口调用“旧的”片段的onAttach,onCreateView等,以通过Activity的实现方法来初始化数据。但是此方法指向通过Activity的onCreate方法创建的新创建的片段。 问题 也许我使用的是错误的模式,但即使是Android 3 Pro书籍也没有太多相关信息。因此,请给我一两次拳,并指出正确的方法。非常感谢! 码 主要活动 public class DashboardActivity extends BasePagerActivity implements OnMessageListActionListener { private MessagesFragment mMessagesFragment; @Override protected void onCreate(Bundle savedInstanceState) { Logger.d("Dash onCreate"); super.onCreate(savedInstanceState); setContentView(R.layout.viewpager_container); new DefaultToolbar(this); // create fragments to use mMessagesFragment = new MessagesFragment(); mStreamsFragment = new StreamsFragment(); // …


16
抽象工厂和工厂设计模式之间有什么区别?
我知道有很多关于这两种模式之间差异的文章,但是有些事情我找不到。 从我所阅读的内容中,我看到工厂方法模式允许您定义如何创建单个具体产品,但是对客户端隐藏了实现,因为他们将看到通用产品。我的第一个问题是关于抽象工厂。它的作用是允许您在其中创建具体对象系列(具体取决于您使用的特定工厂),而不仅仅是单个具体对象?抽象工厂是否仅根据调用的方法返回一个很大的对象或一个很大的对象? 我的最后两个问题是关于一个引号,我无法完全理解我在很多地方都看到过的情况: 两者之间的区别是,在使用抽象工厂模式时,一个类通过组合将对象实例化的责任委托给另一个对象,而工厂方法模式则使用继承并依赖于子类来处理所需的对象实例化。 我的理解是,工厂方法模式具有一个Creator接口,它将使ConcreteCreator负责知道要实例化哪个ConcreteProduct。这是使用继承处理对象实例化的意思吗? 现在关于那句话,抽象工厂模式究竟如何通过组合将对象实例化的职责委托给另一个对象?这是什么意思?在我看来,抽象工厂模式似乎也使用继承来完成构建过程,但是我仍然在学习这些模式。 任何帮助,特别是最后一个问题,将不胜感激。


10
什么是汇总根?
我正在设法弄清楚如何正确使用存储库模式。聚合根的中心概念不断出现。在网络和Stack Overflow上搜索有关总根的帮助时,我一直在寻找有关它们的讨论以及指向应该包含基本定义的页面的无效链接。 在存储库模式的上下文中,什么是聚合根?


10
Android中的单例与应用程序上下文?
回顾这篇文章,列举了使用单例的几个问题, 并看到了几个使用单例模式的Android应用程序的示例,我想知道使用单例而不是通过全局应用程序状态共享的单个实例(将android.os.Application子类化并获取它)是否是一个好主意。通过context.getApplication())。 两种机制都有哪些优点/缺点? 老实说,我希望在此后的Singleton模式与Web应用程序中得到相同的答案,这不是一个好主意!但适用于Android。我对么?否则DalvikVM有什么不同? 编辑:我想对涉及的几个方面有意见: 同步化 可重用性 测试中

5
基于Web的Design Patterns应用程序[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 我正在设计一个简单的基于Web的应用程序。我是这个基于Web的领域的新手,我需要您提供有关设计模式的建议,例如如何在Servlet之间分配责任,创建新Servlet的标准等。 实际上,我主页上的实体很少,而与每个实体相对应,我们几乎没有添加,编辑和删除等选项。早些时候,我对每个选项使用一个Servlet,例如Servlet1用于添加实体1,Servlet2用于编辑实体1,依此类推,这样我们最终拥有大量的Servlet。 现在,我们正在更改设计。我的问题是,如何正确选择如何选择servlet的责任。每个实体是否应该有一个Servlet,它将处理所有选项并将请求转发到服务层。还是应该为整个页面设置一个servlet,它将处理整个页面请求,然后将其转发到相应的服务层?同样,请求对象是否应该转发到服务层。

22
如何学习设计模式?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 6年前关闭。 这个问题的答案是社区的努力。编辑现有答案以改善此职位。它目前不接受新的答案或互动。 我已经阅读了约4-5本书有关设计模式的书籍,但是我仍然不觉得自己已经接近设计模式的中级水平了吗? 我应该如何学习设计模式? 有没有关于设计模式的好书? 我知道这只能凭经验来完成,但是必须有某种方法来掌握这些吗?

19
使用依赖注入的缺点是什么?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我正在尝试在这里将DI作为一种模式进行介绍,我们的一位主要开发人员想知道:使用依赖注入模式的缺点 -如果有的话-有什么缺点? 请注意,我正在这里寻找(如果可能)详尽列表,而不是对该主题进行主观讨论。 澄清:我正在谈论的是依赖注入模式(请参阅Martin Fowler的本文),而不是特定的框架,无论是基于XML的(例如Spring)还是基于代码的(例如Guice),还是“自卷式” 。 编辑:在这里/ r / programming进行了一些很棒的进一步讨论/讨论/辩论。

26
我的Objective-C单例应该是什么样?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 我的单例访问器方法通常是: static MyClass *gInstance = NULL; + (MyClass *)instance { @synchronized(self) { if (gInstance == NULL) gInstance = [[self alloc] init]; } return(gInstance); } 我可以做些什么来改善这一点?

10
如何在C ++中正确实现工厂方法模式
在C ++中有一件事让我很长时间以来一直感到不舒服,因为老实说我不知道​​怎么做,尽管听起来很简单: 如何在C ++中正确实现Factory方法? 目标:允许客户端使用工厂方法而不是对象的构造函数实例化某些对象,而不会造成不可接受的后果和性能损失。 “工厂方法模式”是指对象内部的静态工厂方法或另一个类中定义的方法或全局函数。通常只是“将类X的常规实例化方法重定向到构造函数以外的任何其他地方的概念”。 让我浏览一下我想到的一些可能的答案。 0)不要制造工厂,制造构造函数。 这听起来不错(实际上通常是最好的解决方案),但这不是一般的补救方法。首先,在某些情况下,对象构造是一个任务复杂到足以证明将其提取到另一个类的任务。但是即使抛开这个事实,即使对于仅使用构造函数的简单对象,也常常不起作用。 我知道的最简单的示例是2-D Vector类。如此简单,但棘手。我希望能够同时从笛卡尔坐标和极坐标构造它。显然,我不能做: struct Vec2 { Vec2(float x, float y); Vec2(float angle, float magnitude); // not a valid overload! // ... }; 我的自然思维方式是: struct Vec2 { static Vec2 fromLinear(float x, float y); static Vec2 fromPolar(float angle, float magnitude); // ... }; 这不是构造函数,而是带我使用静态工厂方法……这实际上意味着我正在以某种方式实现工厂模式(“类成为自己的工厂”)。这看起来不错(并且将适合此特定情况),但是在某些情况下会失败,这将在第2点中进行描述。请继续阅读。 …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.