Swift中的设计模式:第一部分-创新设计模式
设计模式是针对软件工程问题的不同解决方案。 没有它们就可以构建软件 但要困难得多。
我将发布有关设计模式的三部分系列。 在这篇文章中,我将讨论创意设计模式。
创建设计模式是处理对象创建机制的设计模式,试图以适合情况的方式创建对象。 对象创建的基本形式可能会导致设计问题或增加设计的复杂性。 创新设计模式通过某种方式控制此对象的创建来解决此问题。
资料来源:Wikipedia.org
在这里,我们将讨论五个创新设计模式以及如何快速使用它们。
这种类型的设计模式用于通过克隆称为原型的现有对象来实例化新对象。
您会看到Apple类实现的Fruit协议的抽象克隆函数,该函数实际上返回当前对象本身。
让我们在操场上运行上面的代码。
//创建原型
let prototype = Apple(count:4)//创建现有对象的副本
让redApple:Apple = prototype.clone()为! 苹果
redApple.count // 4 //添加自己的属性
redApple.set(价格:“ $ 2”)
redApple.price // $ 2 //创建现有对象的副本
让greenApple:Apple = prototype.clone()为! 苹果
greenApple.count // 4 //添加自己的属性
greenApple.set(价格:“ $ 4”)
greenApple.price // $ 4
• 克隆对象时,该对象的所有属性都将复制到
另一个对象。
•当您需要创建对象而又不知道该类的层次结构时,应使用此设计模式
这是最常用的设计模式。 基本上,它只是抽象对象的创建。
创建一个名为FruitFactory的类,该类返回所需对象的类型。
添加一个静态方法,该方法接受名为FruitType的枚举作为参数,并在运行时返回所需的对象。
工厂返回的任何实例的类型都是Interface(以swift 协议 ),任何工厂候选类都必须实现。
在操场上运行以上代码后:
//从FruitFactory类获取Orange类的对象
让橙色= FruitFactory.getFruit(forType:.orange)
orange?.getPrice()//“ $ 5
orange?.getCount()// 2 //从FruitFactory类获取Grapes类的对象
让葡萄= FruitFactory.getFruit(forType:.grapes)
grapes?.getPrice()//“ $ 3”
grapes?.getCount()// 1
•创建的对象的类型在运行时确定。
•这种设计模式使代码库在添加或删除新类型时更加灵活。
这向我们介绍 了接口程序而不是实现程序 的概念 。
此设计模式提供了一个接口,用于创建相关对象的族而无需指定其具体类。 它们通常使用工厂方法模式来实现。
我们有一个抽象工厂叫做 家具厂用于制造不同的产品。 具体的工厂类工厂将实施家具工厂协议。
运行上面的代码。
//创建MyChair类对象
让椅子= Factory.createChair()
chair.count()// 4 //创建MyTable类对象
让表= Factory.createTable()
table.count()// 1
•显示接口,而不是其实现
•抽象工厂就像一个协议,我们将在具体类上使用它来创建对象
这种设计模式将对象的创建过程与其实际用法分开。
首先,我们声明用于创建产品的抽象协议(或接口)。 在这种情况下,它是ShoeShop协议。
耐克 (Class Nike)是封装产品创建过程的具体构建者 。
Director使用构建器协议创建对象。 Director应该使用符合ShoeShop协议的对象进行初始化。
运行代码后。
//创建一个耐克对象
让nike = Nike()//用nike对象实例化Director
let director = Director(shoeShop:nike)//封装了耐克产品的生产过程
director.produce()//“鞋子生产”
•构建公共API时使用Builder模式,因为它不会透露实现细节
•隐藏复杂性。 它在复杂任务之后提供了一个简单的API。
我们通过使用static关键字快速定义Singleton类。 这意味着该对象将仅被实例化一次。 静态属性是延迟初始化的,直到被调用才会实例化。
该对象只有一个副本,并且在全局上被其他对象使用。
我们也可以在Apple框架中看到用法:
//共享的网址会话
让urlSession = URLSession.shared //用户默认值
让userDefaults = UserDefaults.standard
运行代码后
Vehicle.sharedInstance.getName()//“汽车”
•我们使用let关键字来确保shredInstance的值不会改变
•不要忘记添加私有初始化程序,以防止其他类调用其默认初始化程序
这是操场文件的链接。
我们使用创新设计模式的主要原因是,将对象创建的逻辑与其用法分离开来。 通过已经提到的久经考验的解决方案以受控方式创建对象,它有助于降低复杂性。
为了阅读有关行为设计模式的信息,这里是博客的链接 。