美文网首页iOS Developer
ios设计模式之简单工厂模式

ios设计模式之简单工厂模式

作者: 云霄_云霄 | 来源:发表于2020-01-08 15:28 被阅读0次

    最近一直在阅读OC编程之道(ios设计模式解析)一书(往期文章中我也将电子版的下载链接分享了出来)。其中包括23种设计模式和7种设计原则,如下图(此图为网络图片): 设计模式.png

    • 在这里不过多的介绍设计模式和设计原则的问题了,感兴趣的同学可以自行去查阅资料,我在这里只介绍一种设计模式及其代码,那就是简单工厂模式。
    • 何时使用工厂方法
      1、编译时无法准确预期要创建的对象的类;
      2、类想让其子类决定在运行时创建什么;
      3、类有若干辅助类为其子类,而你想将返回哪个子类这一信息局部化;
    • 在Cocoa Touch框架中应用的工厂方法
      工厂方法在Cocoa Touch框架中几乎随处可见,常见的两步对象创建法[[SomeClass alloc] init]。有时,我们已经注意到有一些便利方法返回类的实例。例如,NSNumber有很多numberWith *方法,其中两个是numberWithBool:numberWithChar:。他们是类方法,也就是说我们向NSNumber发送[NSNumber numberWithBool:YES],以获得与传入参数同类型的各种NSNumber实例。与如何创建NSNumber的具体子类型的实例有关的所有细节,都由NSNumber的类工厂方法负责。[NSNumber numberWithBool:YES]的情况是,方法接受值YES,并把NSNumber的内部子类的一个实例初始化,让它能够反映传入的值YES
      我们曾提到有个工厂方法模式的变体,抽象类用它生成具体子类。NSNumber中的这些numberWith *方法是这个变体的一个例子。它们不是用来被NSNumber的私有子类重载的,而是NSNumber创建合适对象的便利方式。
    • 简单的代码逻辑,提现一下工程方法的模式
      文章中我拿生活中日常饮用的饮料来做例子,我们首先会有一个父类,名字是:Drinks,代表饮料。还有三个继承Drinks的子类,名字分别为:可乐CocaCola芬达Fender矿泉水MineralWater。然后我们会有一个专门的工厂类DrinksFactory来管理生产何种饮料,DrinksFactory通过一个枚举和一个方法来生产。
    • 下面我将代码呈现给大家(gitHub工程地址:https://github.com/TianTeng6661/SimpleFactory.git,喜欢的给个星,谢谢)
      1、Drinks
    import UIKit
    class Drinks: NSObject {
        func drinksColor(){
            NSLog("饮料颜色")
        }
    }
    

    2、CocaCola

    import UIKit
    class CocaCola: Drinks {
        override func drinksColor(){
            NSLog("可口可乐是褐色")
        }
    }
    

    3、Fender

    import UIKit
    class Fender: Drinks {
        override func drinksColor(){
            NSLog("芬达是橙色")
        }
    }
    

    4、MineralWater

    import UIKit
    class MineralWater: Drinks {
        override func drinksColor(){
            NSLog("矿泉水是透明色")
        }
    }
    

    5、DrinksFactory

    import UIKit
    
    enum DrinkType:Int {
        case DrinkCocaCola = 0 //可口可乐
        case DrinkFender = 1 //芬达
        case DrinkMineralWater = 3 //矿泉水
    }
    
    class DrinksFactory: NSObject {
    
        func createDrinksWithType(drinkstype:DrinkType) -> Drinks {
            switch drinkstype {
            case .DrinkCocaCola:do {
                let color = CocaCola()
                return color;
                }
            case .DrinkFender:do{
                let fender = Fender()
                return fender;
               }
            case .DrinkMineralWater:do{
             let mineralWater = MineralWater()
             return mineralWater;
            }
          }
        }
    }
    

    当我们在需要生产的时候我们调用方法为

    import UIKit
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
            view.backgroundColor = UIColor.red
            
            let cocaCola:Drinks = DrinksFactory().createDrinksWithType(drinkstype: DrinkType.DrinkCocaCola)
            print(cocaCola .drinksColor()) //可口可乐是褐色
            let fender:Drinks = DrinksFactory().createDrinksWithType(drinkstype: DrinkType.DrinkFender)
            print(fender .drinksColor()) //芬达是橙色
            let mineralWater:Drinks = DrinksFactory().createDrinksWithType(drinkstype: DrinkType.DrinkMineralWater)
            print(mineralWater .drinksColor()) //矿泉水是透明色
      
        }
    }
    

    这样我们就简单实现了一个工厂方法,通过一个工厂类来管理所有饮料的生产,而且我们在需要多生产一种类型的饮料的时候,只需要创建此饮料的类,然后在工厂方法中实现就OK了。

    我在这里只是抛砖引玉,只是在讲解模式,这里面我们还有好多可以扩展的,比如不同的饮料有不同的口味,配方等等,共有的属性我们可以写在父类来实现,但是每个子类也可以有自己特有的属性。

    相关文章

      网友评论

        本文标题:ios设计模式之简单工厂模式

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