1) ๋น๋ ํจํด (Builder Pattern)
- ์ด๋ค Product ์ ์ด๋ฅผ ๋ง๋๋ Builder๋ก ๊ตฌ์ฑ
- ์ด ํจํด์ Swift์ ๊ทธ๋ ๊ฒ๊น์ง ์ ํจํ ํจํด์ ์๋ -> ๋๋ถ๋ถ ์ด๊ธฐํ ๋ฉ์๋์ ํ๋กํผํฐ ๊ธฐ๋ณธ๊ฐ์ ํ์ฉํ์ฌ ํด๊ฒฐ ๊ฐ๋ฅ
- ํ๋กํผํฐ์ ๊ฐ์๊ฐ ๊ต์ฅํ ๋ง์์ง๊ณ ๋ณต์กํด์ง๋ ๊ฒฝ์ฐ์ ์ ์ฉ
struct MacBook {
let color: String
let memory: Int
let storage: String
let hasTouchBar: Bool
}
class MacBookBuilder {
private var color = "Space Gray"
private var memory = 16
private var storage = "256GB"
private var hasTouchBar = false
func setColor(_ color: String) -> MacBookBuilder {
self.color = color
return self
}
func setMemory(_ memory: Int) -> MacBookBuilder {
self.memory = memory
return self
}
func setStorage(_ storage: String) -> MacBookBuilder {
self.storage = storage
return self
}
func setHasTouchBar(_ has: Bool) -> MacBookBuilder {
self.hasTouchBar = has
return self
}
func build() -> MacBook {
return MacBook(color: color, memory: memory, storage: storage, hasTouchBar: hasTouchBar)
}
}
let builder = MacBookBuilder()
let macBook1 = builder.setColor("Silver").setMemory(32).setStorage("512").setHasTouchBar(true).build()
let macBook2 = builder.setMemory(32).setStorage("1TB").build()
let macBook3 = builder.build()
2) ํ๋กํ ํ์ ํจํด (Prototype Pattern)
- ๊ธฐ์กด์ ๊ฐ์ฒด๋ฅผ ๋ณต์ ํ๊ธฐ ์ํ ํจํด -> ์๊ธฐ ์์ ์ ๋ณต์ ํ๋ ํจํด
protocol Prototype: AnyObject {
func clone() -> Self
}
class Seongah: Prototype {
var age: Int
init(age: Int) {
self.age = age
}
func clone() -> Self {
return Seongah(age: self.age) as! Self
}
}
let seongah = Seongah(age: 26)
seongah.age += 10
print("10๋
๋ค ๋์ ๋์ด = \(seongah.age)")
let seongah2 = seongah.clone()
seongah2.age += 30
print("30๋
๋ค ๋์ ๋์ด = \(seongah2.age)")
3) ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด (Factory Method Pattern)
- Creator : Factory ์ ๊ธฐ๋ณธ ์ญํ ์ ์ ์ํ๋ ๊ฐ์ฒด
- Concrete Creator: Creator๋ฅผ ์ฑํํ๊ณ ์์ผ๋ฉฐ Product์ ๋ง๋ ๊ตฌ์ฒด์ ๊ธฐ๋ฅ์ ๊ตฌํ
- Product : Concrete Product ๊ฐ ํด์ผํ ๋์๋ค์ ์ ์ธํ๋ ๊ฐ์ฒด
- Concrete Product: Product๋ฅผ ์ฑํํ๋ฉฐ ๊ทธ์ ๋ง๊ฒ ๋ง๋ ์ค์ ๊ฐ์ฒด
- ์ฅ์ : ํ๋กํ ์ฝ๋ก ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ ์ํด์ฃผ์๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์๋ก์ด ํ์ํด๋์ค ์ถ๊ฐ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ ์ฐ + ํ์ฅ์ฑ ์ข์
- ๋จ์ : Product๊ฐ ์ถ๊ฐ๋ ๋๋ง๋ค ์๋ก์ด ํ์ํด๋์ค๋ฅผ ์ ์ํด์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ๊ฒ ๋ง์ ํด๋์ค๊ฐ ์ ์๋์ด์ง ์ ์์ / ์ค์ฒฉ๋์ด ์ฌ์ฉํ๋ฉด ๋งค์ฐ ๋ณต์กํด์ง ์ฐ๋ ค ์์
// Creator : Factory ์ ๊ธฐ๋ณธ ์ญํ ์ ์ ์ํ๋ ๊ฐ์ฒด
protocol AppleFactory {
func createElectronics() -> Product
}
// Concrete Creator : Creator๋ฅผ ์ฑํํ๊ณ ์์ผ๋ฉฐ Product์ ๋ง๋ ๊ตฌ์ฒด์ ๊ธฐ๋ฅ์ ๊ตฌํ
class iphonFactory: AppleFactory {
func createElectronics() -> Product {
return Iphone()
}
}
class IpadFactory: AppleFactory {
func createElectronics() -> Product {
return Ipad()
}
}
// Product : Concrete Product๊ฐ ํด์ผํ ๋์๋ค์ ์ ์ธํ๋ ๊ฐ์ฒด
protocol Product {
func produceProduct()
}
// Concrete Product : Product๋ฅผ ์ฑํํ๋ฉฐ ๊ทธ์ ๋ง๊ฒ ๋ง๋ ์ค์ ๊ฐ์ฒด
class Iphone: Product {
func produceProduct() {
print("Hello Iphone was made")
}
}
class Ipad: Product {
func produceProduct() {
print("Hello Ipad was made")
}
}
class Client {
func order(factory: AppleFactory) {
let electronicsProduct = factory.createElectronics()
electronicsProduct.produceProduct()
}
}
var client = Client()
client.order(factory: IpadFactory())
client.order(factory: iphonFactory())
4) ์ถ์ ํฉํ ๋ฆฌ ํจํด (Abstract Factory Method)
- Factory๊ฐ ์ถ๊ฐ๋๊ณ ๊ธฐ์กด์ ์กด์ฌํ๋ Product๋ก Factory๋ฅผ ๊ตฌ์ฑํ ๋๋ ๋งค์ฐ ํจ๊ณผ์ ์ธ ํจํด
- ํ๊ณ: ์๋ก์ด ์ข ๋ฅ์ Product๊ฐ ์ถ๊ฐ๋๋ฉด ๊ฐ๊ฐ์ Factory์๋ ์ถ๊ฐํด์ค์ผ ํ๋ ๊ฒฝ์ฐ๋ ์๊น / Product์ ์ถ๊ฐ๋ ๋ณ๋์ด ์ฆ์์ง๋ค๋ฉด ๋ชจ๋ Factory์ ๋ณ๋์ด ์๊ธธ ์ํ์ด ์์
// 1. ์์ฑ์ ๋ด๋นํ Factory ๊ตฌํ
// 1) ์ถ์ํ๋ Factory
protocol UIFactoryalbe {
func createButton() -> Buttonalbe
func createLabel() -> Labelable
}
// 2) ์ฐ๊ด๋ ์ ํ๊ตฐ์ ์ค์ ๋ก ์์ฑํ๋ ๊ตฌ์ฒด factory
final class ipadUIFactory: UIFactoryalbe {
func createButton() -> Buttonalbe {
return IpadButton()
}
func createLabel() -> Labelable {
return IpadLabel()
}
}
final class iphoneUIFactory: UIFactoryalbe {
func createButton() -> Buttonalbe {
return IphoneButton()
}
func createLabel() -> Labelable {
return IPhoneLabel()
}
}
// 2. ์์ฑ๋ Product ๊ตฌํ
// 1) ์ถ์ํ๋ Product
protocol Buttonalbe {
func touchUP()
}
protocol Labelable {
var title: String { get }
}
// 2) ์ค์ ๋ก ์์ฑ๋ ๊ตฌ์ฒด Product, ๊ฐ์ฒด๊ฐ ๊ฐ์ง ๊ธฐ๋ฅ๊ณผ ์ํ๋ฅผ ๊ตฌํ
final class IphoneButton: Buttonalbe {
func touchUP() {
print("iphoneButton")
}
}
final class IPhoneLabel: Labelable {
var title: String = "iPhoneLabel"
}
final class IpadButton: Buttonalbe {
func touchUP() {
print("IpadButton")
}
}
final class IphoneLabel: Labelable {
var title: String = "IphoneLabel"
}
final class IpadLabel: Labelable {
var title: String = "ipadLabel"
}
// Factory ๋ฅผ ํตํด UI๋ฅผ ๋ง๋ค๊ณ ๊ฐ์ง๊ณ ์๋ Class
class UIContent {
var uiFactory: UIFactoryalbe
var label: Labelable?
var button: Buttonalbe?
// ์ฌ์ฉํ UI์ Default๊ฐ์ iphone
init(uiFactory: UIFactoryalbe = iphoneUIFactory()) {
self.uiFactory = uiFactory
setupUI()
}
func setupUI() {
label = uiFactory.createLabel()
button = uiFactory.createButton()
}
}
class ViewController: UIViewController {
var iPadUIContent = UIContent(uiFactory: ipadUIFactory())
var iphonUICOntent = UIContent()
override func viewDidLoad() {
super.viewDidLoad()
touchupButton()
printLabelTitle()
}
func touchupButton() {
iPadUIContent.button?.touchUP()
iphonUICOntent.button?.touchUP()
}
func printLabelTitle() {
print(iPadUIContent.label?.title ?? "")
print(iphonUICOntent.label?.title ?? "")
}
}
5) ์ฑ๊ธํด ํจํด
- ์ฑ ์ ์ฒด์ ๊ฑธ์ณ์ ์ ์ผํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ ์ฌ์ฉ -> ์ด๋์์๋ ์ ์ญ์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ ์ ์ผํ ๊ฐ์ฒด
- ์ผ๋ฐ์ ์ผ๋ก ์ฑ๊ธํด ํจํด์ ๋ชฉ์ ์ธ ์ ์ผํ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด Class ๋ฅผ ์ฌ์ฉ
- ๊ตฌ์กฐ์ฒด๋ก ์ฑ๊ธํด์ ๊ตฌํํ๊ฒ ๋๋ค๋ฉด ๋ง์ฝ ์ฑ๊ธํด ๊ฐ์ฒด๋ฅผ ์ธ์คํด์คํํ๊ฒ ๋ ๋ ์ ์ผํ์ง ๋ชปํ ๊ฐ์ฒด๊ฐ ๋จ
- ์ฅ์ : ์ ์ผํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ๋ค์ํ ๊ฐ์ฒด๋ค์๊ฒ ๊ณต์ ๋๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค๋ ์ฅ์ / ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ๋ฐฉ์ง
- ๋จ์ : ๊ฐ์ฒด ์งํฅ ๊ด์ ์์ ๋ณธ๋ค๋ฉด ์ธ์คํด์ค๋ค ๊ฐ์ ๊ฒฐํฉ๋๊ฐ ๋์์ ธ์ OCP(๊ฐ๋ฐฉ-ํ์ ์์น, Open-Closed Principle) ์ ์๋ฐฐํ๊ฒ ๋๋ค๋ ๋จ์ ์ด ์์ (OCP๋ ๋ชจ๋์ ํ์ฅ์๋ ์ด๋ ค์์ด์ผ ํ๊ณ , ๋ณ๊ฒฝ์๋ ๋ซํ์์ด์ผ ํ๋ค๋ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์์น ์ค ํ๋)
'iOS > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ARC ์์๋ณด๊ธฐ (0) | 2024.07.06 |
---|---|
Struct / Class ๋ ๋ฌด์์ธ๊ฐ? (1) | 2024.04.25 |
[Swift] ์ด๋ฏธ์ง๋ฅผ ์ํ ์ด๋ฏธ์ง๋ก ๋ณ๊ฒฝํ๊ณ ํ ๋๋ฆฌ ์ค์ ํ๋ ๋ฐฉ๋ฒ (0) | 2022.07.05 |
[1day - 6day TIL] 100 days of swift (0) | 2022.04.30 |
[3/18 - 3/22 TIL] Coursera - LearnQuestIntroduction to Programming in Swift 5 (0) | 2022.03.22 |