OC编程之道-创建对象之抽象工厂方法

摘要:
类集群是基于抽象工厂模式思想的抽象工厂模式。创建抽象产品的工厂方法与创建抽象工厂的工厂方法不同:显然,应该在特定工厂NSCFNumber和NSCFBoolean中重载intValue和boolValue等工厂方法,以返回实际产品。简单工厂、工厂方法和抽象工厂之间的区别和相似性简单工厂模式的工厂类通常使用静态方法通过接收的不同参数返回不同的对象实例。抽象工厂抽象工厂处理产品系列的概念。

定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

                 <AbstractProductA>        <AbstractProductB>

<AbstractFactory>       createProuductA               createProductB

<ConcreteFactory1>         createProductA->productA1         createProductB->productB1

<ConcreteFactory2>      createProductA->productA2        createProuuctB->productB2

抽象工厂与工厂方法:创建对象而不让客户端知晓返回了什么确切的具体对象

   抽象工厂              工厂方法

通过对象组合创建抽象产品      通过类继承创建抽象产品

创建多系列产品           创建一种产品

必须修改父类的接口才能支持新产品  子类化创建者并重载工厂方法以创建新产品

应用: 在touchPainter中为两个公司贴牌 Sierra Corporation和acme Corporation贴Sierra和Acme

tips:软件设计的黄金法则:变动需要抽象

                UIView        UIButton        UIToolBar

brandingFactory       brandedView     brandedMainButton   brandedToolBar

SierraBrandingFactory    sierraView       sierraMainButton     sierraToolBar

AcmeBrandingFactory     acmeView       acmeButton         acmeToolBar

在这种方案下,客户端只需要知道4个实体:brandingFactory、UIView、UIButton、UIToolBar,这样,将来如果需要在需要在其他领域扩展应用程序的品牌活动、可以通过添加新的产品和品牌工厂得以实现,而不影响客户端代码。

实现:

BrandingFactory:NSObject

方法:

+ (BrandingFactory *)factory;//将会返回实际的产品

- (UIView *)brandedView;// return nil;

- (UIButton *)brandedMainButton;// return nil;

- (UIToolBar *)brandedToolBar;//return nil;

+ (BrandingFactory *)factory

{
#if defined (USER_ACME)

  return [[[AcmeBrandingFactory alloc]init]autorelease];

#elif defined (USER_SIERRA)

  return [[SierraBrandingFactory alloc]init]autorelease];

#else

  return nil;

#endif

}

AcmeBrandingFactory:BrandingFactory

并不重载 factory方法,因为他原本用于父类创建具体brandingFactory实例,但是我们无法防止类方法被子类重载。

BrandingFactory以类簇的形式实现,其中一组相关的子类组合在一起,由其超类创建。这种工厂构建过程常见于Cocoa Touch框架的基础类库。

譬如:NSNumber 有一系列共有API,定义了各种类型的数所共有的行为。客户端在使用时无需知道NSNumber实例的具体类型。

类簇是抽象工厂的一种模式,基于抽象工厂模式的思想。它将若干相关的私有具体工厂子类集合到一个公有的抽象超类之下。比如NSNumber本身是一个高度抽象的工厂,而NSCFBoolean和NSCFNumber是具体工厂子类。子类是具体工厂。

创建抽象产品的工厂方法与创建抽象工厂的工厂方法有个不同点:

显然,intValue和boolValue这样的工厂方法,应在具体工厂NSCFNumber与NSCFBoolean中重载以返回实际产品。

其他像numberWithBool:和numberWithInt,这样的工厂方法并不是为了返回产品,而是为了返回产品的工厂,因此他们不应在具体工厂子类中重载。

总结:抽象工厂模式是一种极为常见的设计模式,他是最基本的,因为他可以设计许多类型的对象创建。一系列相关类的好的模式,应该作为一种抽象,不为客户端所见。抽象工厂可以顺畅滴提供这种抽象,而不暴露创建过程中任何不必要的细节或所创建对象的确切类型。

简单工厂,工厂方法,抽象工厂之间的异同

简单工厂

简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。

不修改代码的话,是无法扩展的。

工厂方法

工厂方法是针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。

在同一等级结构中,支持增加任意产品。

抽象工厂

抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。

应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。

小结

★工厂模式中,重要的是工厂类,而不是产品类。产品类可以是多种形式,多层继承或者是单个类都是可以的。但要明确的,工厂模式的接口只会返回一种类型的实例,这是在设计产品类的时候需要注意的,最好是有父类或者共同实现的接口。

★使用工厂模式,返回的实例一定是工厂创建的,而不是从其他对象中获取的。

★工厂模式返回的实例可以不是新创建的,返回由工厂创建好的实例也是可以的。

区别

简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)

工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)   
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)   

以上三种工厂 方法在等级结构和产品族这两个方向上的支持程度不同。所以要根据情况考虑应该使用哪种方法。

原文链接:http://blog.csdn.net/superbeck/article/details/4446177

免责声明:文章转载自《OC编程之道-创建对象之抽象工厂方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用goaccess对Nginx日志简单分析LQR和iLQR、DDP下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[Java核心技术]五-继承(枚举类)

Java枚举类型(enum) 枚举类型都是继承了Enum类(是一个抽象类)的一个类,我们可以向enum类中添加方法和变量等。编译再反编译可以看到枚举类型对应的类的内容。 每个枚举常量都对应一个Enum类的实例。 例子 public enum Day2 { MONDAY("星期一"), TUESDAY("星期二"), WEDNES...

Kotlin入门(14)继承的那些事儿

上一篇文章介绍了类对成员的声明方式与使用过程,从而初步了解了类的成员及其运用。不过早在《Kotlin入门(12)类的概貌与构造》中,提到MainActivity继承自AppCompatActivity,而Kotlin对于类继承的写法是“class MainActivity : AppCompatActivity() {}”,这跟Java对比有明显差异,那么...

Java 设计模式六原则及23中常用设计模式

一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访...

结构化方法与面向对象方法的比较

1.结构化方法 结构化方法,是70年代末,由Demarco等人提出的,旨在减少分析活动中的错误,建立满足用户需求的系统逻辑模型。结构化方法是强调开发方法的结构合理性以及所开发软件的结构合理性的软件开发方法,也称为新生命周期法,是生命周期法的继承与发展,是生命周期法与结构化程序设计思想的结合。其基本思想是用系统工程的思想和工程化得方法,根据用户至上的原则,自...

java中abstract的用法

abstract(抽象)修饰符,可以修饰类和方法1,abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型,抽象类就像当于一类的半成品,需要子类继承并覆盖其中的抽象方法。2,abstract修饰方法,会使这个方法变成抽象方法,也就是只有声明(定义)而没有实现,实现部分以";"代替。需要子类...

OOTV杯设计模式大赛——模式总结

摘抄自《大话设计模式》一书 报名参赛: “来、来、来,快来报名了,设计模式大赛,每个人都有机会,每个人都能成功,今天你参加比赛给自己一个机会,明天你就成功还社会一个辉煌。来来......”台子上方一很长的横幅,上写着“OOTV杯设计模式大赛海选”,下面一个帅小伙拿着话筒卖力的吆喝着。 “大姐、二姐,我们也去参加报名参加吧。”工厂三姐妹中最小的简单工厂说道,...