【问题标题】:What is the syntax and use of a factory method in Objective-CObjective-C中工厂方法的语法和用法是什么
【发布时间】:2014-02-20 14:01:13
【问题描述】:

我一直在网上搜索试图了解什么是工厂方法,但我没有找到任何显示具体示例的简单示例。我在其中一本书中简要介绍了它们,但它没有显示示例,也没有解释它们是什么“类方法通常用作工厂方法”。

1- Objective-C 中工厂方法的语法和用法是什么? This 是我找到的最接近的答案,但是当我尝试作为答案的评论中的示例时,我收到一条消息说我不能打电话给 super。这个问题我比较关心工厂方法的实现语法。

2- 工厂方法在其他语言中是否称为构造函数?

3- 工厂方法与单例相比如何?

来自 Apple 文档:

它们将分配和初始化结合在一个步骤中,并返回 创建对象

这不是单例的作用吗?

在下面的单例示例中,我们可以说类方法 sharedData 是工厂方法吗?

.m 文件

#import "SingletonModel.h"
@implementation SingletonModel
static SingletonModel *sharedData;

- (id) init {
    if (self = [super init]) {
        // custom initialization
    }
    return self;
}

 // is this a factory method?
+(SingletonModel*) sharedData
{
    if (!sharedData) {
        sharedData = [[SingletonModel alloc]init];
    }
    return sharedData;
}
@end

【问题讨论】:

标签: ios objective-c factory-pattern


【解决方案1】:

人们可能对不同的事物使用相同的术语。通常你通过调用来创建一个对象

MyClass* object = [[MyClass alloc] initWithParameters... ];

你知道你得到了一个 MyClass 类的对象(在 Objective C 中这不是相当正确的,但大多数情况下)。现在假设 MyClass 有几个子类。作为调用者,你不知道也不关心这些子类。如果对象属于 MySubClass 类,您不会知道也不会在意。但是 MyClass 的实现者很关心。他或她创建了可以更好地用于不同目的的子类。所以他创建了一个工厂方法,你这样称呼它:

MyClass* object = [MyClass objectForParameters:... ];

类方法objectForParameters查看参数并决定返回哪种对象。代码可能看起来像

if (...)
    return [[MySubClass1 alloc] initWithParameters:...];
else if (...)
    return [[MySubClass2 alloc] initWithParameters:...];
else
    return [[MySubClass3 alloc] initWithParameters:...];

你不知道你得到了什么样的对象,但你知道你可以把它当作它属于 MyClass 类。这种方法通常被称为“工厂方法”。这是一家为您制造物品的工厂。 决定你得到哪种对象,而不是你。

【讨论】:

  • 如果我在这个例子中理解正确,你基本上将 MyClass 作为基类,然后是从 MyClass 类继承的 3 个其他类(MySubClass1、MySubClass2 和 MySubClass3),然后是第四个,一个FactoryClass,它#imports其他4个类,然后在FactoryClass内部可能有一个工厂类方法,它基于一个参数它将决定它需要返回哪个类的哪个实例,我说得对吗?如果我是正确的,这就是 Apple 的 String 工厂方法的创建方式吗?+string +stringWithFormat:+stringWithContentsOfFile:encoding:error:
  • 我认为您已经阅读了太多关于编程模式的书籍。你在这个例子中看到任何工厂类吗?你能想到工厂班有什么好处吗?工厂类方法有什么好处?你只是把事情复杂化了。
  • @gasher729 这真的很有用。您可以发布示例链接或其他内容吗?
  • @gnasher729 : 这是最好的方法,你能举个例子吗?
【解决方案2】:

Objective-C中工厂方法的语法和用法是什么

如果我们以UIColor 为例,工厂方法将是+ (UIColor *)blackColor, + (UIColor *)clearColor, ...

从您引用的另一个问题来看,任何init... 方法都应该是实例方法(- (...),而不是+ (...))。在那个答案中,它是一个类方法,它不应该是。

工厂方法在其他语言中叫构造函数吗

他们都有相同的目的。并非所有语言都区分内存分配和内存初始化。

工厂方法与单例相比如何

单例通常提供一个方法来返回类的单个实例。它不是严格意义上的工厂方法,因为它不会在每次调用时创建不同的实例,但它是同一种东西。

【讨论】:

  • 你是说我引用的问题中的语法看起来不错,除了第一类方法需要是实例方法?非常感谢您的帮助。
【解决方案3】:

工厂方法是一种对对象进行所有常见创建并将其返回给您的方法。
例如:您想要一个方法中的 UIColor,但您希望您的方法在 iOS 和 MacOS 中是跨平台的。在这种情况下,对于 MacOS,你需要这个方法来返回 NSColor,而对于 iOS,你需要 UIColor。所以最好的办法是使用 Factory 方法,根据您的平台返回不同的对象。

(id)colorWithType:(ColorType)type
{
  id color;
    switch(type) {
      case type1:
       // create the colour for type1
       break;
  case type2:
      // create the colour for type2
      break;

  // now check the platform 
  if([self isCurrentPlatformMacOS]){
       // convert color to NSColor
  } else {
       // convert color to UIColor
  }
  return color;
  }
}

观看此视频会更容易理解。
http://www.youtube.com/watch?v=AsfM6YLtu9g (前往3:00时间)

【讨论】:

    【解决方案4】:

    设计模式可以通过经过验证的解决方案帮助您解决复杂的编码问题,并且工厂为一个或一组对象提供了一个创建点。它也有助于不编码到具体的类good example and syntax

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多