美文网首页
设计模式--工厂模式(抽象工厂)

设计模式--工厂模式(抽象工厂)

作者: user_bo | 来源:发表于2019-02-25 16:41 被阅读0次

    1.工厂模式(抽象工厂)

    抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态,是为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

    抽象工厂和简单工厂的区别:抽象工厂返回的是所需工厂,简单工厂返回的是所需产品

    2.具体案例 (指定工厂生产手机)

    谷歌工厂生产谷歌手机,
    三星工厂可以生成三星手机。
    通过抽象工厂的模式设计程序

    程序类角色划分:
    抽象工厂:

    //抽象工厂 :具备生产手机的功能
    
    @interface BaseFactory : NSObject
    - (BasePhone *) creatPhone;
    @end
    
    @implementation BaseFactory
    //由 具体子类 复写该方法
    - (BasePhone *) creatPhone{
        return nil;
    }
    @end
    

    具体工厂: 谷歌工厂,三星工厂

    //谷歌工厂: 生成谷歌手机
    @interface GoogleFactory : BaseFactory
    @end
    
    @implementation GoogleFactory
    - (BasePhone *)creatPhone{
        NSLog(@"GoogleFactory products");
        return [[GooglePhone alloc]init];
    }
    @end
    
    //三星工厂:生产三星手机
    @interface SamsungFactory : BaseFactory
    @end
    
    @implementation SamsungFactory
    - (BasePhone *)creatPhone{
        NSLog(@"SamsungFactory products");
        return [[SamsungPhone alloc]init];
    }
    @end
    

    抽象产品:

    // 可以封装 产品的共有功能
    @interface BasePhone : NSObject
    @end
    @implementation BasePhone
    @end
    

    具体产品:谷歌手机,三星手机

    // 三星手机
    @interface SamsungPhone : BasePhone
    @end
    
    @implementation SamsungPhone
    @end
    
    //谷歌手机
    @interface GooglePhone : BasePhone
    @end
    
    @implementation GooglePhone
    @end
    

    工厂管理类::

    #import "BaseFactory.h"
    #import "GoogleFactory.h"
    #import "SamsungFactory.h"
    
    // 枚举工厂的类型
    typedef enum : NSUInteger {
        kGoogle = 0x01,
        kSamsung,
    } EFactoryType;
    
    @interface FactoryManager : NSObject
    /**
     便利构造器
     @param type 创建工厂的类型
     @return 返回创建的工厂
     */
    + (BaseFactory *)factoryWithType:(EFactoryType) type;
    @end
    
    @implementation FactoryManager
    + (BaseFactory *)factoryWithType:(EFactoryType) type{
        
        BaseFactory *factory = nil;
        if (type == kGoogle){
            factory = [[GoogleFactory alloc]init];
        }else if (type == kSamsung){
            factory = [[SamsungFactory alloc]init];
        }
        return factory;
    }
    @end
    

    客户端调用

      // 抽象工厂模式 vc客户端调用
        BaseFactory * factory = [FactoryManager factoryWithType:kGoogle];// 只需要更换枚举值,就可以更换指定工厂
    
        [factory creatPhone];
    
    

    3.抽象工厂的UML

    抽象工厂.png

    client :vc客户端 ,abstractFactory:抽象工厂类
    productFactory1:谷歌工厂 , productFactory2:三星工厂
    abstractProductA:手机 ,abstractProductB:手环
    productA2:三星手机 ,productB2:三星手环
    productA1:谷歌手机 ,productB1:谷歌手环

    uml解析:
    client -- abstractFactory :关联关系
    client --abstractProductA / abstractProductB :关联关系

    abstractFactory -- productFactory1 / productFactory2 : 泛化关系
    abstractProductA -- productA1 / productB1 : 泛化关系
    abstractProductB -- productA2 / productB2 : 泛化关系

    productFactory1 -- productA1 / productB1 : 依赖关系
    productFactory2 -- productA2 / productB2 :依赖关系

    注释 :
    泛化(generalization)关系: (继承)
    时指一个类(子类、子接口)继承另外一个类(称为父类、父接口)的功能,并可以增加它自己新功能的能力,继承是类与类或者接口与接口最常见的关系,在Java中通过关键字extends来表示。

    相关文章

      网友评论

          本文标题:设计模式--工厂模式(抽象工厂)

          本文链接:https://www.haomeiwen.com/subject/pmdgyqtx.html