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

本文深入探讨了抽象工厂模式,对比了简单工厂、工厂方法及抽象工厂的区别,详细讲解了抽象工厂如何通过对象组合创建一系列相关产品,适用于产品族的概念,支持增加新产品族而不影响现有代码。

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

                 <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.youkuaiyun.com/superbeck/article/details/4446177

转载于:https://www.cnblogs.com/encoreMiao/p/5250881.html

通过短时倒谱(Cepstrogram)计算进行时-倒频分析研究(Matlab代码实现)内容概要:本文主要介绍了一项关于短时倒谱(Cepstrogram)计算在时-倒频分析中的研究,并提供了相应的Matlab代码实现。通过短时倒谱分析方法,能够有效提取信号在时间与倒频率域的特征,适用于语音、机械振动、生物医学等领域的信号处理与故障诊断。文中阐述了倒谱分析的基本原理、短时倒谱的计算流程及其在实际工程中的应用价值,展示了如何利用Matlab进行时-倒频图的可视化与分析,帮助研究人员深入理解非平稳信号的周期性成分与谐波结构。; 适合人群:具备一定信号处理基础,熟悉Matlab编程,从事电子信息、机械工程、生物医学或通信等相关领域科研工作的研究生、工程师及科研人员。; 使用场景及目标:①掌握倒谱分析与短时倒谱的基本理论及其与傅里叶变换的关系;②学习如何用Matlab实现Cepstrogram并应用于实际信号的周期性特征提取与故障诊断;③为语音识别、机械设备状态监测、振动信号分析等研究提供技术支持与方法参考; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,先理解倒谱的基本概念再逐步实现短时倒谱分析,注意参数设置如窗长、重叠率等对结果的影响,同时可将该方法与其他时频分析方法(如STFT、小波变换)进行对比,以提升对信号特征的理解能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值