ํฐ์คํ ๋ฆฌ ๋ทฐ
ํผ์ ๊ฐ๊ฒ๋ฅผ ์ด์ํ๋ฉฐ ํฉํ ๋ฆฌ ํจํด์ ๋ํด ์์๊ฐ๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ ํผ์๋ฅผ ์ฃผ๋ฌธ๋ฐ์ต๋๋ค.
์ฃผ๋ฌธ์ ๋ฐ์ผ๋ฉด ํผ์ ํ์ ์ ๊ฒฐ์ ํ๊ณ ,
์ค๋นํ๊ณ ํฌ์ฅํ๊ณ ํผ์๋ฅผ ๋ฐํํ๋ ๊ณผ์ ์ ๋๋ค.
protocol Pizza {
var name: String { get }
func prepare()
func bake()
func cut()
func box()
}
class CheesePizza: Pizza {
var name: String { return "Cheese Pizza" }
func prepare() { print("Preparing \(name)") }
func bake() { print("Baking \(name)") }
func cut() { print("Cutting \(name)") }
func box() { print("Boxing \(name)") }
}
class PepperoniPizza: Pizza {
var name: String { return "Pepperoni Pizza" }
func prepare() { print("Preparing \(name)") }
func bake() { print("Baking \(name)") }
func cut() { print("Cutting \(name)") }
func box() { print("Boxing \(name)") }
}
func orderPizza(type: String) -> Pizza {
var pizza: Pizza
if type == "cheese" {
pizza = CheesePizza()
} else if type == "greek" {
pizza = GreekPizza()
} else if type == "pepperoni" {
pizza = PepperoniPizza()
} else {
fatalError("Unsupported pizza type")
}
pizza.prepare()
pizza.bake()
pizza.cut()
pizza.box()
return pizza
}
let cheesePizza = orderPizza(type: "cheese")
์ข ๋ฅ์ ๋ฐ๋ผ ๋ฐํํ ํผ์๋ฅผ ๋ถ๊ธฐ์ฒ๋ฆฌ ํ๊ณ ์์ต๋๋ค.
๋ถ๊ธฐํ์ฌ ํผ์ ํ์ ์ ๊ฒฐ์ ํ๋ ๋ถ๋ถ์
์บก์ํํ์ฌ ๋ฐ๋ก ๋ถ๋ฆฌ ํด๋๋ฉด ์ข๋ค๊ณ ํฉ๋๋ค.
์ด์
- ๋จ์ํ๋ ์ธํฐํ์ด์ค ์ ๊ณต
- ์์ ์ ํ๋ ค๊ณ ํ ๋ ํ๊ตฐ๋ฐ๋ง ํ์ธํ๋ฉด๋จ
๊ฐ์ ๋ orderPizza ํจ์
protocol Pizza {
var name: String { get }
func prepare()
func bake()
func cut()
func box()
}
class CheesePizza: Pizza {
var name: String { return "Cheese Pizza" }
func prepare() { print("Preparing \(name)") }
func bake() { print("Baking \(name)") }
func cut() { print("Cutting \(name)") }
func box() { print("Boxing \(name)") }
}
class PepperoniPizza: Pizza {
var name: String { return "Pepperoni Pizza" }
func prepare() { print("Preparing \(name)") }
func bake() { print("Baking \(name)") }
func cut() { print("Cutting \(name)") }
func box() { print("Boxing \(name)") }
}
// Simple Factory
class SimplePizzaFactory {
func createPizza(type: String) -> Pizza {
if type == "cheese" {
return CheesePizza()
} else if type == "greek" {
return GreekPizza()
} else if type == "pepperoni" {
return PepperoniPizza()
} else {
fatalError("Unsupported pizza type")
}
}
}
class PizzaStore {
let pizzaFactory: SimplePizzaFactory
init(factory: SimplePizzaFactory) {
self.pizzaFactory = factory
}
func orderPizza(type: String) -> Pizza {
let pizza = pizzaFactory.createPizza(type: type)
pizza.prepare()
pizza.bake()
pizza.cut()
pizza.box()
return pizza
}
}
let simpleFactory = SimplePizzaFactory()
let pizzaStore = PizzaStore(factory: simpleFactory)
let cheesePizza = pizzaStore.orderPizza(type: "cheese")
let greekPizza = pizzaStore.orderPizza(type: "greek")
let pepperoniPizza = pizzaStore.orderPizza(type: "pepperoni")
B ํผ์์ง์์ ์ด ์ฝ๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ SimpleFactory (ํผ์ ์ข ๋ฅ) ๋ถ๋ถ๋ง ์์ ํ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ์บก์ํ ํ๋๊ฒ์ 'Simple Factory'
๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ญํ ์
ํ๋์ ํฉํ ๋ฆฌ ํด๋์ค๊ฐ ์ ๋ดํ๋ ํํ๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
๋ง์ฝ
ํ์ฌ ๊ฐ๊ฒ(SimplePizzaFactory)์์๋ cheese, greek, pepperoni 3์ข ๋ฅ์ธ๋ฐ,
C ํผ์์ง์์๋ greekํผ์๋ ์ํ๊ณ veggie๋ฅผ ํ๊ณ ์ถ์ผ๋ฉด ์ด๋ป๊ฒ ํ ๊น?
ํผ์ ์ข ๋ฅ๋ฅผ ์ถ๊ฐํ๊ฒ ๋ ๊ฒฝ์ฐ else if type == "์ด๋ค ํผ์" ์ด๋ฐ์์ผ๋ก ์์ ํ๊ฒ ๋ฉ๋๋ค.
'๋ณ๊ฒฝ ์ฌํญ์ ๋ซํ ์์ง ์๋ค'๊ณ ๋ณผ ์ ์์
// Simple Factory
class SimplePizzaFactory {
func createPizza(type: String) -> Pizza {
if type == "cheese" {
return CheesePizza()
} else if type == "greek" {
return GreekPizza()
} else if type == "pepperoni" {
return PepperoniPizza()
} else {
fatalError("Unsupported pizza type")
}
}
}
์ ์์ค ๋ชจ๋์ธ ํผ์ Class๊ฐ ๋ณ๊ฒฝ๋๋ฉด,
๊ณ ์์ค ๋ชจ๋์ธ SimplePizzaFactory๊ฐ ์ํฅ์ ๋ฐ์ผ๋ฏ๋ก DIP ์์น์ ์ด๊ธ๋จ
-> ์ถ์ํ ์์ค์ด ๋์๊ฒ์ ์์กดํ๋๋ก ๊ตฌํ์ ํด์ผํ๋ค๊ณ ํฉ๋๋ค
์ด ๋ถ๋ถ์
๋ณ๊ฒฝ ์ฌํญ์ ๋ซํ์๊ณ ,
ํ์ฅ์ ์ฉ์ดํ๊ฒ + DIP ์ค์ํ๋๋ก ์์ ํ๋ค๋ฉด
protocol Pizza {
var name: String { get }
func prepare()
func bake()
func cut()
func box()
}
class NYStyleCheesePizza: Pizza {
var name: String { return "NYStyle Cheese Pizza" }
func prepare() { print("Preparing \(name)") }
func bake() { print("Baking \(name)") }
func cut() { print("Cutting \(name)") }
func box() { print("Boxing \(name)") }
}
class NYStylePepperoniPizza: Pizza {
var name: String { return "NYStyle Pepperoni Pizza" }
func prepare() { print("Preparing \(name)") }
func bake() { print("Baking \(name)") }
func cut() { print("Cutting \(name)") }
func box() { print("Boxing \(name)") }
}
protocol PizzaFactory {
func createPizza() -> Pizza
}
class NYStyleCheesePizzaFactory: PizzaFactory {
func createPizza() -> Pizza {
return CheesePizza()
}
}
class NYStylePepperoniPizzaFactory: PizzaFactory {
func createPizza() -> Pizza {
return PepperoniPizza()
}
}
class PizzaStore {
let pizzaFactory: PizzaFactory
init(factory: PizzaFactory) {
self.pizzaFactory = factory
}
func orderPizza() -> Pizza {
let pizza = pizzaFactory.createPizza()
pizza.prepare()
pizza.bake()
pizza.cut()
pizza.box()
return pizza
}
}
let cheeseFactory = CheesePizzaFactory()
let pepperoniFactory = PepperoniPizzaFactory()
let cheesePizzaStore = PizzaStore(factory: cheeseFactory)
let pepperoniPizzaStore = PizzaStore(factory: pepperoniFactory)
let cheesePizza = cheesePizzaStore.orderPizza()
let pepperoniPizza = pepperoniPizzaStore.orderPizza()
createPizza๋ฅผ ์ธํฐํ์ด์ค์ ์ ์ธํด๋๊ณ , ์ธํฐํ์ด์ค๋ฅผ ์ฑํํ์ฌ
ํ์ ํผ์ ํด๋์ค(NYStyleCheesePizzaFactory)์์ create์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ํ๋๋ก ํด์คฌ์ต๋๋ค
๊ทธ๋ฌ๊ณ PizzaStore(factory: PizzaFactroy) ์ด๋ฐ์์ ์ธ๋ถ ์์กด์ฑ ์ฃผ์ (DI)์ ํตํด
์ ์์ค ๋ชจ๋(ํผ์ ์ข ๋ฅ)๊ฐ ๋ณ๊ฒฝ๋์ด๋ ๊ณ ์์ค ๋ชจ๋(PizzaStore)๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ก ์์ ๊ฐ๋ฅํฉ๋๋ค.
์ ๋ฐฉ์์ด 'ํฉํ ๋ฆฌ ํจํด(ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด)'์ผ๋ก
ํด๋์ค ์ธ์คํดํธ ๋ง๋๋ ์ผ์ ์๋ธ ํด๋์ค์์ ํ๋๋ก ์ค๊ณํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
PizzaFactory ๋ด๋ถ์์ ์ด๋ค ํผ์๋ ์๊ด์์ด ๋ค ํผ์๋ฅผ ๋ฐํ ํ ์ ์์ผ๋ฏ๋ก ์ ์ฐํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก
์ถ์ ํฉํ ๋ฆฌ ํจํด
: ๊ตฌ์ ํด๋์ค์ ์์กดํ์ง ์๊ณ ๋ ์๋ก ์์กด์ ์ธ ๊ฐ์ฒด๋ก ์ด๋ฃจ์ด์ง ์ ํ๊ตฐ์ ์์ฐํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ํจํด
-> A ๊ฐ์ฒด(์์นด๊ณ ํผ์)์ B ๊ฐ์ฒด(๋ด์ ํผ์) ๋ชจ๋ ์ฐ์ด๋ ์์(ํผ์ ๋ํ ์ฌ๋ฃ)๋ฅผ ์ธํฐํ์ด์ค๋ก ์ ์ธํด๋๋๊ฑธ ์ถ์ํฉํ ๋ฆฌ ํจํด์ด๋ผ๊ณ ํ๋๊ฒ ๊ฐ์์
๊ฐ์ฌํฉ๋๋ค
- Total
- Today
- Yesterday
- swift touch outside parentView
- xcode mark ํ
- xcode ํ๋ฒ์ ์ฌ๋ฌ์ค ํธ์ง
- swift textview ์๊ฐ
- swift ํ๊ฐ
- xcode ๋จ์ถํค ๊ฟํ
- xcode code ๋จ์ถ
- xcode ui code ์ง์ ๋ถ
- ios ๊ฐ์ update
- xcode ํจ์ ํ๋ฒ์ ์ ๊ธฐ
- swift line spacing
- swift code snippet
- swift textview ํ๊ฐ
- swift uilabel ์๊ฐ
- xcode ui code dirty
- swift ๊ฐ์ ์ ๋ฐ์ดํธ
- xcode code snippet
- reduce xcode build time
- swift fast build
- xcode ์ฌ๋ฌ์ค ํธ์ง
- swift ์๊ฐ
- swift ๋ถ๋ชจ๋ทฐ ์ธ๋ถ์์ญ ํฐ์น
- swift uilabel ํ๊ฐ
- swift ํ๊ฐ extension
- swift line spacing extension
- ios ์ฑ ์ ๋ฐ์ดํธ
- xcode ํจ์ ์ ๊ธฐ
- fast build xcode
- swift ์ฑ ์ ๋ฐ์ดํธ
- swift ์๊ฐ Extension
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |