设计模式学习 - 简单工厂模式

本文介绍了简单工厂模式的概念、特点及其实现方式,并通过一个比萨店的案例详细展示了该模式的应用场景。简单工厂模式能够有效地将产品的创建过程与使用过程解耦。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单工厂模式:

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

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

 

该模式的组成部分:

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

 

转载于:https://www.cnblogs.com/ziyeSky/p/4493643.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值