zoukankan      html  css  js  c++  java
  • 设计模式学习

    简单工厂模式:

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

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

    该模式的组成部分:

    • 一个使用者:(在案例中为 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("正在打包...
    ")
        }
        
        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、测试结果

  • 相关阅读:
    ESP8266 A0的使用
    电脑总是被乱装各种软件怎么办?那就设置一个密码吧!
    笔记本光驱位改装固态系统硬盘教程
    任务管理器无法呼出
    Python stomp 介绍与代码
    Power(x,y)
    旋转图像
    字符串相乘
    缺失的正数
    外观数列
  • 原文地址:https://www.cnblogs.com/ziyeSky/p/4493643.html
Copyright © 2011-2022 走看看