美文网首页
iOS设计(三)2 设计模式之创建型模式

iOS设计(三)2 设计模式之创建型模式

作者: shuaikun | 来源:发表于2020-12-03 10:09 被阅读0次

    创建型模式

    定义:

    创建型模式处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象。基本的对象创建方式可能会导致设计上的问题,或增加设计的复杂度。创建型模式通过以某种方式控制对象的创建来解决问题。

    主导思想构成。

    (1)是将系统使用的具体类封装起来
    (2)是隐藏这些具体类的实例创建和结合的方式。

    一、抽象工厂模式

    定义:抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

      类簇是一种把一个公共的抽象超类下的一些私有的具体子类组合在一起的架构。抽象超类负责声明创建私有子类实例的方法,会根据被调用方法的不同分配恰当的具体子类,每个返回的对象都可能属于不同的私有子类。
      Cocoa将类簇限制在数据存储可能因环境而变的对象生成上。Foundation框架为NSStringNSDataNSDictionaryNSSet、和NSArray对象定义了类簇。公共超类包括上述的不可变类和与其相互补充的可变类NSMutableStringNSMutableDataNSMutableDictionaryNSMutableSet、和NSMutableArray

    3E13CDD1-2CD2-4C66-BD33-DECBF172AE03.jpg
    import Foundation
    
    class GzCity {//广州市有两个啤酒厂
        var abstractFactory1: IAbstractFactory?
        var abstractFactory2: IAbstractFactory?
    }
    
    protocol IAbstractFactory {//抽象工厂
        func createProductA() -> IProduct
        func createProductB() -> IProduct
    }
    
    protocol IProduct {
        var name: String { get }
    }
    
    class BearProduct: IProduct {//啤酒产品
        var name: String = "啤酒"
    }
    
    class ConcreteFactory1: IAbstractFactory {//啤酒工厂1
        func createProductA() -> IProduct {
            return BearProduct()
        }
    
        func createProductB() -> IProduct {
            return BearProduct()
        }
    }
    
    class ConcreteFactory2: IAbstractFactory {//啤酒工厂2
        func createProductA() -> IProduct {
            return BearProduct()
        }
    
        func createProductB() -> IProduct {
            return BearProduct()
        }
    }
    
    

    二、建造者模式

    定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
    • 当构造过程必须允许被构造的对象有不同的表示时。
    image
    import Foundation
    
    protocol IBuilder {
        func createProduct() -> IProduct
    }
    
    protocol IProduct {
        var name: String { get }
    }
    
    class BeerProduct: IProduct {
        var name: String = "啤酒"
    }
    
    class Director {//领导
        var builder: ConcreteBuilder?
    
        func construct() {//指导生产
            guard let product = builder?.createProduct() else {return}
            print("生产产品" + product.name)
        }
    }
    
    class ConcreteBuilder: IBuilder {//生产者
        func createProduct() -> IProduct {
            return BeerProduct()
        }
    }
    
    

    三、工厂方法模式

    定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。

    • 当一个类不知道它所必须创建的对象的类的时候。
    • 当一个类希望由它的子类来指定它所创建的对象的时候。
    • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
    image
    import Foundation
    
    class ConcreteCreator: ICreator {//生产者
        func factoryMethod() -> IProduct {
            return ConcreteProduct()
        }
    }
    
    protocol ICreator {
        func factoryMethod() -> IProduct
    }
    
    protocol IProduct {
        var name: String { get }
    }
    
    class ConcreteProduct: IProduct {
        var name: String = "啤酒"
    }
    
    

    四、原型模式

    定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

      原型模式是非常简单的一种设计模式, 在多数情况下可被理解为一种深复制的行为。在Objective-C中使用原型模式, 首先要遵循NSCoping协议(OC中一些内置类遵循该协议, 例如NSArray, NSMutableArray等)。刚才我们提到了深复制, 一图以蔽之:

    image

    下面为UML图

    image
    import Foundation
    
    class Client {
        var prototype: IPrototype!
    
        func operation() -> IProduct {
            return prototype.clone()
        }
    }
    
    protocol IPrototype {
        func clone() -> IProduct
    }
    
    protocol IProduct {
        var name: String { get }
    }
    
    class ConcreteProduct: IProduct, IPrototype {
        var name: String = "啤酒"
    
        func clone() -> IProduct {
            let p = ConcreteProduct()
            p.name = name
            return p
        }
    }
    
    

    五、单例模式

    定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。该类需要跟踪单一的实例,并确保没有其它实例被创建。单例类适合于需要通过单个对象访问全局资源的场合。

      有几个Cocoa框架类采用单例模式,包括NSFileManagerNSWorkspace、和NSApplication类。这些类在一个进程中只能有一个实例。当客户代码向该类请求一个实例时,得到的是一个共享的实例,该实例在首次请求的时候被创建。

    image
    import Foundation
    
    class Singleton {
        static let instance: Singleton = Singleton()
    
        init() {
    
        }
    }
    

    参考博客:https://www.jianshu.com/p/e5c69c7b8c00
    更全面的地址:https://www.runoob.com/design-pattern/design-pattern-tutorial.html

    相关文章

      网友评论

          本文标题:iOS设计(三)2 设计模式之创建型模式

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