Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added Design-Patterns-CN.playground.zip
Binary file not shown.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,245 @@
/*:

创建型模式
========

> 创建型模式是处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象。基本的对象创建方式可能会导致设计上的问题,或增加设计的复杂度。创建型模式通过以某种方式控制对象的创建来解决问题。
>
>**来源:** [维基百科](https://zh.wikipedia.org/wiki/%E5%89%B5%E5%BB%BA%E5%9E%8B%E6%A8%A1%E5%BC%8F)

## 目录

* [行为型模式](Behavioral)
* [创建型模式](Creational)
* [结构型模式](Structural)
*/
import Foundation
/*:
🌰 抽象工厂(Abstract Factory)
-------------

抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。

### 示例:

协议
*/

protocol BurgerDescribing {
var ingredients: [String] { get }
}

struct CheeseBurger: BurgerDescribing {
let ingredients: [String]
}

protocol BurgerMaking {
func make() -> BurgerDescribing
}

// 工厂方法实现

final class BigKahunaBurger: BurgerMaking {
func make() -> BurgerDescribing {
return CheeseBurger(ingredients: ["Cheese", "Burger", "Lettuce", "Tomato"])
}
}

final class JackInTheBox: BurgerMaking {
func make() -> BurgerDescribing {
return CheeseBurger(ingredients: ["Cheese", "Burger", "Tomato", "Onions"])
}
}

/*:
抽象工厂
*/

enum BurgerFactoryType: BurgerMaking {

case bigKahuna
case jackInTheBox

func make() -> BurgerDescribing {
switch self {
case .bigKahuna:
return BigKahunaBurger().make()
case .jackInTheBox:
return JackInTheBox().make()
}
}
}
/*:
### 用法
*/
let bigKahuna = BurgerFactoryType.bigKahuna.make()
let jackInTheBox = BurgerFactoryType.jackInTheBox.make()
/*:
👷 生成器(Builder)
--------------

一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

### 示例:
*/
final class DeathStarBuilder {

var x: Double?
var y: Double?
var z: Double?

typealias BuilderClosure = (DeathStarBuilder) -> ()

init(buildClosure: BuilderClosure) {
buildClosure(self)
}
}

struct DeathStar : CustomStringConvertible {

let x: Double
let y: Double
let z: Double

init?(builder: DeathStarBuilder) {

if let x = builder.x, let y = builder.y, let z = builder.z {
self.x = x
self.y = y
self.z = z
} else {
return nil
}
}

var description:String {
return "Death Star at (x:\(x) y:\(y) z:\(z))"
}
}
/*:
### 用法
*/
let empire = DeathStarBuilder { builder in
builder.x = 0.1
builder.y = 0.2
builder.z = 0.3
}

let deathStar = DeathStar(builder:empire)
/*:
🏭 工厂方法(Factory Method)
-----------------------

定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。

### 示例:
*/
protocol CurrencyDescribing {
var symbol: String { get }
var code: String { get }
}

final class Euro: CurrencyDescribing {
var symbol: String {
return "€"
}

var code: String {
return "EUR"
}
}

final class UnitedStatesDolar: CurrencyDescribing {
var symbol: String {
return "$"
}

var code: String {
return "USD"
}
}

enum Country {
case unitedStates
case spain
case uk
case greece
}

enum CurrencyFactory {
static func currency(for country: Country) -> CurrencyDescribing? {

switch country {
case .spain, .greece:
return Euro()
case .unitedStates:
return UnitedStatesDolar()
default:
return nil
}

}
}
/*:
### 用法
*/
let noCurrencyCode = "No Currency Code Available"

CurrencyFactory.currency(for: .greece)?.code ?? noCurrencyCode
CurrencyFactory.currency(for: .spain)?.code ?? noCurrencyCode
CurrencyFactory.currency(for: .unitedStates)?.code ?? noCurrencyCode
CurrencyFactory.currency(for: .uk)?.code ?? noCurrencyCode
/*:
🃏 原型(Prototype)
--------------

通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的“原型”,这个原型是可定制的。

### 示例:
*/
struct MoonWorker {

let name: String
var health: Int = 100

init(name: String) {
self.name = name
}

func clone() -> MoonWorker {
return MoonWorker(name: name)
}
}
/*:
### 用法
*/
let prototype = MoonWorker(name: "Sam Bell")

var bell1 = prototype.clone()
bell1.health = 12

var bell2 = prototype.clone()
bell2.health = 23

var bell3 = prototype.clone()
bell3.health = 0
/*:
💍 单例(Singleton)
--------------

单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为

### 示例:
*/
final class ElonMusk {

static let shared = ElonMusk()

private init() {
// Private initialization to ensure just one instance is created.
}
}
/*:
### 用法
*/
let elon = ElonMusk.shared // There is only one Elon Musk folks.
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*:

设计模式(Swift 5.0 实现)
======================

([Design-Patterns-CN.playground.zip](https://raw.githubusercontent.com/ochococo/Design-Patterns-In-Swift/master/Design-Patterns-CN.playground.zip)).

👷 源项目由 [@nsmeme](http://twitter.com/nsmeme) (Oktawian Chojnacki) 维护。

🇨🇳 中文版由 [@binglogo](https://twitter.com/binglogo) 整理翻译。

## 目录

* [行为型模式](Behavioral)
* [创建型模式](Creational)
* [结构型模式](Structural)
*/
import Foundation

print("您好!")
Loading