美文网首页
设计模式

设计模式

作者: 小凡凡520 | 来源:发表于2018-09-16 17:09 被阅读4次
    代理模式

    当一个类的某些功能需要由别的类来实现、但是又不确定具体会是哪个类实现。

    有两个主体:委托者(方法调用者)、代理者(方法实现者)。

    观察者模式

    观察者注册自己感兴趣的事件、被观察者不需要知道观察者的存在。

    • 通知
      UIKeyboardWillShowNotification、UIKeyboardWillHideNotification
    • KVO
      键值观察
    单例模式

    主要用于共享资源、并且确保该实例只被初始化一次。

    工厂模式

    专门定义一个类来负责创建其他类的实例、被创建的实例常常具有共同的父类(基于多态)。

    工厂模式分为三种:简单工厂模式、工厂模式、抽象工厂模式。

    • 简单工厂模式
      由一个工厂类、根据传入的参数(通常是枚举)、动态的决定创建出哪一个产品类的实例。

        //AnimalHouse
        + (Animal *)animalWithType:(AnimalType)type {
            Animal *animal = nil;
            if (type == AnimalTypeDog) {//狗
                animal = [[Dog alloc] init];
            } else if (type == AnimalTypeCat) {
                animal = [[Cat alloc] init];
            } else if (type == AnimalTypeSheep) {
                animal = [[Sheep alloc] init];
            }
            return animal;
        }
      
        Animal *dog = [AnimalHouse animalWithType:AnimalTypeDog];
        [dog shout];
        Animal *cat = [AnimalHouse animalWithType:AnimalTypeCat];
        [cat shout];
        Animal *sheep = [AnimalHouse animalWithType:AnimalTypeSheep];
        [sheep shout];
      
    • 工厂模式
      相比简单工厂、将《工厂》也进行抽象处理。

        //DogHouse
        + (Animal *)animal {
            Animal *animal = [[Dog alloc] init];
            return animal;
        }
      
        Animal *dog = [DogHouse animal];
        [dog shout];
        Animal *cat = [CatHouse animal];
        [cat shout];
        Animal *sheep = [SheepHouse animal];
        [sheep shout];
      
    • 抽象工厂模式
      与工厂模式的基本模式相同。最大的区别就是工厂实例不在只生产一种产品、而是生产一个产品族。

        //AnimalHouse
        + (AnimalHouse *)houseWithType:(AnimalType)type {
            AnimalHouse *house = nil;
            if (type == AnimalTypeDog) {//狗
                house = [[DogHouse alloc] init];
            } else if (type == AnimalTypeCat) {
                house = [[CatHouse alloc] init];
            } else if (type == AnimalTypeSheep) {
                house = [[SheepHouse alloc] init];
            }
            return house;
        }
      
        //内部生成具体工厂`DogHouse `
        // AnimalHouse *animalHouse = [AnimalHouse houseWithType:AnimalTypeDog];
        //或者也可以直接使用具体工厂
        AnimalHouse *animalHouse = [[DogHouse alloc] init];
        //内部生成具体产品`MaleDog`
        MaleAnimal* maleAnimal = [animalHouse maleAnimal];
        //内部生成具体产品`femaleDog`
        FemaleAnimal* femaleAnimal = [animalHouse femaleAnimal];
        //使用该产品
        [maleAnimal shout];
        [femaleAnimal shout];

    相关文章

      网友评论

          本文标题:设计模式

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