简单工厂模式:
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
注:严格来说简单工厂模式不属于设计模式,但它经常被使用。它的优点在于将产品的创建从产品的使用中解耦出来单独进行处理。
该模式的组成部分:
- 一个使用者:(在案例中为 PizzaStore)
- 一个简单工厂类:负责创建产品
- 一组产品类:(在案例中为 抽象Pizza类及其具体实现的子类)
UML类图如下:
案例代码的具体实现:
1、产品使用者类:
class PizzaStore { // 包含了一个产品的抽象类 和 一个简单工厂 var pizza:Pizza = Pizza() var simplePizzaFactory:SimplePizzaFactory = SimplePizzaFactory() // 提供pizza 方法 func orderPizza(pizzatype: Pizzatype) { // 通过简单工厂 -> 创建产品(Pizza) pizza = simplePizzaFactory.createPizza(pizzatype) // 产品的行为 pizza.prepare() pizza.bake() pizza.cut() pizza.box() } }
2、简单工厂类
class SimplePizzaFactory { var pizza: Pizza = Pizza() // 创建 Pizza(通过不同的参数创建不同的Pizza) func createPizza(pizzatype: Pizzatype) -> Pizza { switch pizzatype { case Pizzatype.Cheese: pizza = CheesePizza() case Pizzatype.Clam: pizza = ClamPizza() } return pizza } }
3、产品类:(包含了抽象类 及其 具体实现类)
class Pizza { var name:String = "" var dough:String = "" var sauce:String = "" var toppings:[String] = [] // 准备pizza 方法 func prepare() { println("正在准备 \(name) ...") println("Tossing dough...") println("Adding sauce...") for topping:String in toppings { println(" \(topping)") } } func box() { println("正在打包...\n") } func bake() { println("正在烘焙...") } func cut() { println("正在裁剪...") } } class CheesePizza: Pizza { override init() { super.init() self.name = "Cheese Pizza" self.dough = "Thin Crust Dough" self.sauce = "Marinara Sauce" toppings.append("Grated Reggino Cheese") } } class ClamPizza: Pizza { override init() { super.init() self.name = "Clam Pizza" self.dough = "Low Crust Dough" self.sauce = "Cherry Sauce" toppings.append("Grated Reggino Clam") } }
4、测试代码
let pizzaStore = PizzaStore() // 从 pizzaStore 获取一个 Cheese Pizza pizzaStore.orderPizza(Pizzatype.Cheese) // 从 pizzaStore 获取一个 Clam Pizza pizzaStore.orderPizza(Pizzatype.Clam)
5、测试结果