设计模式学习 - 工厂模式
工厂模式:
定义了一个创建对象的接口,但由它的子类决定实例化哪一个对象。工厂方法将对象的实例化延迟到了子类。
模式组成:
- 一组使用者:父类定义一个创建对象的接口及其他通用接口,子类负责创建对象接口的具体实现(在案例中为 PizzaStore 及 NYPizzaStore)
- 一组产品类:(在案例中为 抽象Pizza类及其具体实现的子类)
注:
- 每一个使用者的子类负责创建一个(组)相似对象。
UML 类图:
代码具体实现:
1、 对象的创建者: PizzaStore 类
// pizza Store 父类:包含了创建pizza(createPizza)这个抽象方法 class PizzaStore {// 包含了一个产品的抽象类 和 一个简单工厂var pizza:Pizza = Pizza()// 提供 pizza 方法 func orderPizza(pizzatype: Pizzatype) {// 获取相应商店创建的 pizza 对象的引用self.pizza = createPizza(pizzatype)// 产品的行为 pizza.prepare()pizza.bake()pizza.cut()pizza.box()}// 创建一个 负责创建对象的接口,但是它由实现子类具体实现func createPizza(pizzatype: Pizzatype) -> Pizza {return Pizza()} }// 纽约Pizza商店:负责创建纽约风味的Pizza class NYPizzaStore: PizzaStore {// 具体实现 负责创建对象的接口override func createPizza(pizzatype: Pizzatype) -> Pizza {switch pizzatype {case Pizzatype.Cheese:pizza = NYCheesePizza()case Pizzatype.Clam:pizza = NYClamPizza()}return pizza} }// 芝加哥Pizza商店:负责创建芝加哥风味的Pizza class ChicagoPizzaStore: PizzaStore {// 具体实现 负责创建对象的接口override func createPizza(pizzatype: Pizzatype) -> Pizza {switch pizzatype {case Pizzatype.Cheese:pizza = ChicagoCheesePizza()case Pizzatype.Clam:pizza = ChicagoClamPizza()}return pizza} }
2、对象类:
// 对象的父类 class Pizza {var name:String = ""var dough:String = ""var sauce:String = ""var toppings:[String] = []// 准备pizza 方法 func prepare() {println("正在准备 \(name) ...")println("Tossing dough...")println("加入 \(sauce)...")for topping:String in toppings {println(" \(topping)")}}func box() {println("正在打包...\n")}func bake() {println("正在烘焙...")}func cut() {println("正在裁剪...")} }// 一个纽约风味的 Cheese Pizza; 它与 纽约风味的 Clem Pizza 同为一组 class NYCheesePizza: Pizza {override init() {super.init()self.name = "纽约风味的 Cheese Pizza"self.dough = "Thin Crust Dough"self.sauce = "草莓 酱汁"toppings.append("Grated Reggino Cheese")} }// 一个纽约风味的 Clam Pizza class NYClamPizza: Pizza {override init() {super.init()self.name = "纽约风味的 NYClam Pizza"self.dough = "Low Crust Dough"self.sauce = "樱桃 酱汁"toppings.append("Grated Reggino Clam")} }// 一个芝加哥风味的 Cheese Pizza; 它与 芝加哥风味的 Clem Pizza 同为一组 class ChicagoCheesePizza: Pizza {override init() {super.init()self.name = "芝加哥风味的 Cheese Pizza"self.dough = "Thin Crust Dough"self.sauce = "芒果 酱汁"toppings.append("Grated Reggino Cheese")}// 子类也可以覆盖父类的方法override func cut() {println("正在裁剪:裁剪成方块状...")} }// 一个芝加哥风味的 Clam Pizza class ChicagoClamPizza: Pizza {override init() {super.init()self.name = "芝加哥风味的 Clam Pizza"self.dough = "Low Crust Dough"self.sauce = "烤肉 酱汁"toppings.append("Grated Reggino Clam")}// 子类也可以覆盖父类的方法override func cut() {println("正在裁剪:裁剪成方块状...")} }
3、测试代码:
// 先访问 纽约Pizza商店 var pizzaStore: PizzaStore = NYPizzaStore() // 买一个纽约风味的CheesePizza /* 先调用了 NYPizzaStore 的 orderPizza 方法,再由 orderPizza 方法调用 createPizza 方法; 其中 orderPizza 方法是父类创建的,为子类所共有使用,orderPizza 并不需要知道这个 Pizza 到底是哪一个种类的,只需要知道这是一个 Pizza 能进行准备、裁剪等行为就足够了 而 createPizza 方法则是子类自己按照相应的情况具体实现去创建相应风味的 Pizza; */ pizzaStore.orderPizza(Pizzatype.Cheese)// 再访问 芝加哥Pizza商店,买一个芝加哥风味的ClamPizza pizzaStore = ChicagoPizzaStore() pizzaStore.orderPizza(Pizzatype.Clam)
4、测试结果
转载于:https://www.cnblogs.com/ziyeSky/p/4494846.html
设计模式学习 - 工厂模式相关推荐
- 格力电器Java面试题_JAVA设计模式学习--工厂模式
今天谈一下对工厂模式学习的总结. 看完视频和文章之后要自己表述工厂模式,总是感觉无从说起,不知道怎么去定义工厂模式,反复看了几遍之后终于理解一点. 自己理解工厂模式是通过这两种模式的特点来理解和定义的 ...
- 设计模式学习--工厂模式
1.概述 工厂模式根据提供给他的数据,返回一个可能类中的一个类的实例. 2.示例 1using System; 2using System.Collections.Generic; 3using ...
- 设计模式学习-工厂模式
工厂模式 工厂方法模式通过选取相关的实现类来满足调用组件的请求,调用组件无需了解这些实现. 何时使用 调用组件需要根据不同情况调用多个类的时候可以考虑使用工厂 下面是示例代码 ///用基类实现更合适. ...
- 设计模式之工厂模式(三)
上一次我们已经通过代码,简单的认识了工厂方法模式,具体的思路请移步到设计模式之工厂模式(二),进行查看.这次,让我们通过设计模式的思想,来好好认识下工厂方法模式. 创建者和产品 所有工厂模式都用来封装 ...
- Java设计模式之 工厂模式(简单工厂模式)
前一阵子学习了Java 中据说是最简单的设计模式的 单例模式,想一起讨论学习的小伙伴请点击这里: Java 设计模式之单例模式 那么今天就把学习的工厂模式记录下来 工厂模式: 实现了创建者和调用者的分 ...
- Java设计模式之工厂模式 (工厂方法模式)
上一篇我们学习了简单工厂模式,最后对于增加新产品的缺点,我们在工厂方法模式中解决. 为学习简单工厂模式的小伙伴点击这里Java 设计模式之工厂模式(简单工厂模式) 工厂方法模式要点: 避免简单工厂模式 ...
- 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)
[JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...
- Java设计模式(工厂模式>抽象工厂模式和原型模式)
Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...
- JavaScript设计模式--简单工厂模式例子---XHR工厂
JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...
最新文章
- Elasticsearch 存储模型
- 1 0.99999的悖论_悖论向量中文版下载_悖论向量中文版单机游戏下载
- JVM源码分析之javaagent原理完全解读
- canvas笔记-globalAlpha和globaleCompositeOperation的使用
- dedecms如何快速删除跳转的文章(记得清空内容回收站)
- 设计灵感|如果你喜欢多彩的配色搭配!看这里!
- k8s核心技术-资源编排(yaml)的编写方式---K8S_Google工作笔记0019
- 定时自动清除tmp工具tmpwatch
- 支持x86架构的通用计算机,X86架构模式
- Youtube油管视频类别标签列表
- 一张图概括App启动流程
- 如何从零构建对内网穿透的理解
- 最新CTR预测服务的GPU优化实践
- 区块链核心概念(1)
- python2代码转换python3(2018新)
- 【C# Opencv机器视觉】 Opencv水位检测、液体高度检测、卡尺高度检测
- 测码奔腾-Alpha冲刺总结
- spm12安装与使用
- Learning Disentangled Label Representations for Multi-label Classification
- 开发板ARM加FPGA架构运动控制卡 运动控制器 架构源码 原理图 资料包含此运动控制卡原理图,PCB图
热门文章
- 基于OpenCV高斯模型的公共场景人流量统计
- yum安装mysql驱动_centos7下使用yum安装mysql
- java不需要导的包
- 075_JSON.parse()
- java string 后几位_java中String占几个位元组
- 数据链路层协议_数据链路层 基本数据链路协议
- Android Volley完全解析1:初识Volley的基本用法
- Android中Canvas绘图之Shader使用图文详解
- 总线上加三个终端电阻可以吗_什么是RS485总线?怎么使用RS485总线?
- python安装linux软件_Linux之安装常用软件