简单工厂模式:

简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

注:严格来说简单工厂模式不属于设计模式,但它经常被使用。它的优点在于将产品的创建从产品的使用中解耦出来单独进行处理。

 

该模式的组成部分:

  • 一个使用者:(在案例中为 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、测试结果

 

 posted on 2015-05-11 09:22  子叶_Sky  阅读(138)  评论(0编辑  收藏  举报