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

时间:2014-02-20 14:01:13

标签: ios objective-c factory-pattern

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

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

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

4 个答案:

答案 0 :(得分:5)

人们可能会对不同的事物使用相同的术语。通常通过调用

创建一个对象
MyClass* object = [[MyClass alloc] initWithParameters... ];

你知道你得到了一个MyClass类的对象(在Objective C中它不是相当,但主要是)。现在让我们说MyClass有几个子类。作为调用者,您不知道也不关心这些子类。如果object是MySubClass类,你就不会知道也不会关心。但MyClass的实施者关心。他或她创建了可以更好地用于不同目的的子类。所以他创建了一个工厂方法,你可以这样称呼它:

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

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

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

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

答案 1 :(得分:4)

  

Objective-C

中工厂方法的语法和用法是什么?

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

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

  

工厂方法是否是其他语言中的构造函数

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

  

工厂方法与单身人士相比如何

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

答案 2 :(得分:1)

工厂方法是为对象进行所有常见创建并将其返回给您的方法 例如:您希望从方法中获取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时间)

答案 3 :(得分:0)

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