zoukankan      html  css  js  c++  java
  • 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.csdn.net/superbeck/article/details/4446177

  • 相关阅读:
    算法(Algorithms)第4版 练习 1.3.4
    算法(Algorithms)第4版 练习 1.3.5
    算法(Algorithms)第4版 练习 1.3.6
    微服务迁移步骤建议
    xxxx interview问题解读与总结
    乐观锁与悲观锁——解决并发问题
    编码解码--三种常见字符编码简介:ASCII、Unicode和UTF-8
    编码解码--url编码解码
    分页缓存预加载算法
    Could not initialize class sun.awt.X11FontManager 异常问题
  • 原文地址:https://www.cnblogs.com/encoreMiao/p/5250881.html
Copyright © 2011-2022 走看看