标签: design-patterns

如何正确实现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!
    // ...
};
Run Code Online (Sandbox Code Playgroud)

我的自然思维方式是:

struct Vec2 {
    static Vec2 fromLinear(float x, float y);
    static Vec2 fromPolar(float angle, float magnitude);
    // ...
};
Run Code Online (Sandbox Code Playgroud)

其中,而不是构造函数,导致我使用静态工厂方法...这实际上意味着我正在以某种方式实现工厂模式("类成为自己的工厂").这看起来不错(并且适合这种特殊情况),但在某些情况下失败,我将在第2点中描述.继续阅读.

另一种情况:试图通过某些API的两个opaque typedef(例如不相关域的GUID,或GUID和位域)重载,类型在语义上完全不同(所以 - 理论上 - 有效的重载)但实际上它们实际上是同样的事情 - 像无符号的int或void指针.


1)Java方式

Java很简单,因为我们只有动态分配的对象.制造工厂同样简单:

class FooFactory {
    public Foo createFooInSomeWay() {
        // can be a static method as well,
        //  if we don't need the factory …
Run Code Online (Sandbox Code Playgroud)

c++ design-patterns idioms factory-method

309
推荐指数
7
解决办法
16万
查看次数

我什么时候应该使用访客设计模式?

我一直在博客中看到对访客模式的引用,但我必须承认,我只是不明白.我阅读了维基百科文章的模式,我理解它的机制,但我仍然对我何时使用它感到困惑.

作为最近刚刚获得装饰模式的人,现在看到它在任何地方的用途我都希望能够直观地理解这个看似方便的模式.

design-patterns visitor-pattern

308
推荐指数
14
解决办法
10万
查看次数

为什么IoC/DI在Python中不常见?

在Java中,IoC/DI是一种非常常见的做法,广泛用于Web应用程序,几乎所有可用的框架和Java EE.另一方面,也有很多大的Python Web应用程序,但除了Zope(我听说代码应该非常糟糕),IoC在Python世界中似乎并不常见.(如果你认为我错了,请说出一些例子).

当然有几个流行的Java IoC框架克隆可用于Python,例如springpython.但它们似乎都没有被实际使用.至少,我从来没有在一个stumpled Django的SQLAlchemy的 + <insert your favorite wsgi toolkit here>,它使用类似的东西,基于Web应用程序.

在我看来,IoC具有合理的优势,并且可以很容易地替换django-default-user-model,但是在Python中广泛使用接口类和IoC看起来有点奇怪而不是"pythonic".但也许有人有更好的解释,为什么IoC没有在Python中广泛使用.

python architecture design-patterns dependency-injection inversion-of-control

296
推荐指数
12
解决办法
9万
查看次数

287
推荐指数
19
解决办法
12万
查看次数

Singleton:如何使用它

编辑:从另一个问题我提供了一个答案,链接到很多关于单身人士的问题/答案:有关单身人士的更多信息:

所以我读过Singletons的帖子:好的设计还是拐杖?
争论仍然激烈.

我认为单身人士是一种设计模式(好的和坏的).

Singleton的问题不是模式而是用户(对不起所有人).每个人和他们的父亲都认为他们可以正确地实施一个(而且从我做过的许多采访中,大多数人都做不到).此外,因为每个人都认为他们可以实现正确的Singleton,他们滥用模式并在不合适的情况下使用它(用Singletons替换全局变量!).

所以需要回答的主要问题是:

  • 什么时候应该使用Singleton
  • 如何正确实现Singleton

我对这篇文章的希望是,我们可以在一个地方收集(而不是谷歌和搜索多个网站)一个权威的来源,了解何时(以及如何)正确使用单身人士.同样合适的还有一份反用法和常见的不良实施清单,解释了为什么他们无法工作以及为了实现他们的弱点.


所以让球滚动:
我会举起手来说这是我用的,但可能有问题.
我喜欢"Scott Myers"在他的书"Effective C++"中处理这个主题

使用单身人士的好情况(不是很多):

  • 记录框架
  • 线程回收池
/*
 * C++ Singleton
 * Limitation: Single Threaded Design
 * See: http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf
 *      For problems associated with locking in multi threaded applications
 *
 * Limitation:
 * If you use this Singleton (A) within a destructor of another Singleton (B)
 * This Singleton (A) must be fully constructed before the constructor of (B)
 * is called.
 */
class MySingleton
{ …
Run Code Online (Sandbox Code Playgroud)

c++ singleton design-patterns

285
推荐指数
9
解决办法
17万
查看次数

关系数据库设计模式?

设计模式通常与面向对象的设计有关.
是否有用于创建和编程关系数据库的设计模式
许多问题肯定必须有可重复使用的解决方案.

示例包括表格设计,存储过程,触发器等模式......

是否有类似于martinfowler.com的此类模式的在线存储库?


模式可以解决的问题示例:

  • 存储分层数据(例如,具有类型的单个表与具有1:1密钥和差异的多个表...)
  • 存储具有可变结构的数据(例如,通用列vs xml vs分隔列...)
  • 非规范化数据(如何以最小的影响做到这一点......等等)

rdbms database-design design-patterns

273
推荐指数
6
解决办法
10万
查看次数

依赖注入和服务定位器模式之间有什么区别?

这两种模式看起来都像是控制反转原理的实现.也就是说,一个对象不应该知道如何构造它的依赖关系.

依赖注入(DI)似乎使用构造函数或setter来"注入"它的依赖项.

使用构造函数注入的示例:

//Foo Needs an IBar
public class Foo
{
  private IBar bar;

  public Foo(IBar bar)
  {
    this.bar = bar;
  }

  //...
}
Run Code Online (Sandbox Code Playgroud)

服务定位器似乎使用了一个"容器",它连接了它的依赖关系并给它foo吧.

使用服务定位器的示例:

//Foo Needs an IBar
public class Foo
{
  private IBar bar;

  public Foo()
  {
    this.bar = Container.Get<IBar>();
  }

  //...
}
Run Code Online (Sandbox Code Playgroud)

因为我们的依赖项只是对象本身,所以这些依赖项具有依赖项,它们具有更多依赖项,依此类推.因此,控制容器的反转(或DI容器)诞生了.示例:Castle Windsor,Ninject,Structure Map,Spring等)

但是,IOC/DI容器看起来完全相同像一个服务定位器.将它称为DI容器是一个坏名字?IOC/DI容器只是另一种服务定位器吗?当我们有很多依赖关系时,我们使用DI容器这一事实的细微差别是什么?

design-patterns dependency-injection service-locator

271
推荐指数
11
解决办法
7万
查看次数

存储库模式逐步解释

有人可以向我解释.NET中的存储库模式,一步一步给出一个非常简单的示例或演示.

我知道这是一个非常常见的问题,但到目前为止我还没有找到满意的答案.

c# asp.net design-patterns repository

269
推荐指数
2
解决办法
24万
查看次数

工厂模式.何时使用工厂方法?

什么时候在对象中使用工厂方法而不是Factory类是个好主意?

design-patterns factory factory-method factory-pattern

261
推荐指数
8
解决办法
14万
查看次数

Android上使用了哪些设计模式?

我正在对移动平台进行一项小型研究,我想知道Android中使用了哪些设计模式?

例如在iOS中,模型 - 视图 - 控制器与委托和其他模式一起被广泛使用.

哪些模式以及Android使用的具体位置?

编辑

我不是要求内核,dalvik等深入使用的设计模式,而是要求应用程序开发人员在开发应用程序时遇到的模式.

android design-patterns

257
推荐指数
9
解决办法
14万
查看次数