工厂模式:

定义了一个创建对象的接口,但由它的子类决定实例化哪一个对象。工厂方法将对象的实例化延迟到了子类。

模式组成:

  • 一组使用者:父类定义一个创建对象的接口及其他通用接口,子类负责创建对象接口的具体实现(在案例中为 PizzaStore 及 NYPizzaStore)
  • 一组产品类:(在案例中为 抽象Pizza类及其具体实现的子类)

注:

  1.   每一个使用者的子类负责创建一个(组)相似对象。

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

设计模式学习 - 工厂模式相关推荐

  1. 格力电器Java面试题_JAVA设计模式学习--工厂模式

    今天谈一下对工厂模式学习的总结. 看完视频和文章之后要自己表述工厂模式,总是感觉无从说起,不知道怎么去定义工厂模式,反复看了几遍之后终于理解一点. 自己理解工厂模式是通过这两种模式的特点来理解和定义的 ...

  2. 设计模式学习--工厂模式

    1.概述 工厂模式根据提供给他的数据,返回一个可能类中的一个类的实例. 2.示例  1using System;  2using System.Collections.Generic;  3using ...

  3. 设计模式学习-工厂模式

    工厂模式 工厂方法模式通过选取相关的实现类来满足调用组件的请求,调用组件无需了解这些实现. 何时使用 调用组件需要根据不同情况调用多个类的时候可以考虑使用工厂 下面是示例代码 ///用基类实现更合适. ...

  4. 设计模式之工厂模式(三)

    上一次我们已经通过代码,简单的认识了工厂方法模式,具体的思路请移步到设计模式之工厂模式(二),进行查看.这次,让我们通过设计模式的思想,来好好认识下工厂方法模式. 创建者和产品 所有工厂模式都用来封装 ...

  5. Java设计模式之 工厂模式(简单工厂模式)

    前一阵子学习了Java 中据说是最简单的设计模式的 单例模式,想一起讨论学习的小伙伴请点击这里: Java 设计模式之单例模式 那么今天就把学习的工厂模式记录下来 工厂模式: 实现了创建者和调用者的分 ...

  6. Java设计模式之工厂模式 (工厂方法模式)

    上一篇我们学习了简单工厂模式,最后对于增加新产品的缺点,我们在工厂方法模式中解决. 为学习简单工厂模式的小伙伴点击这里Java 设计模式之工厂模式(简单工厂模式) 工厂方法模式要点: 避免简单工厂模式 ...

  7. 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)

    [JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...

  8. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  9. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

最新文章

  1. Elasticsearch 存储模型
  2. 1 0.99999的悖论_悖论向量中文版下载_悖论向量中文版单机游戏下载
  3. JVM源码分析之javaagent原理完全解读
  4. canvas笔记-globalAlpha和globaleCompositeOperation的使用
  5. dedecms如何快速删除跳转的文章(记得清空内容回收站)
  6. 设计灵感|如果你喜欢多彩的配色搭配!看这里!
  7. k8s核心技术-资源编排(yaml)的编写方式---K8S_Google工作笔记0019
  8. 定时自动清除tmp工具tmpwatch
  9. 支持x86架构的通用计算机,X86架构模式
  10. Youtube油管视频类别标签列表
  11. 一张图概括App启动流程
  12. 如何从零构建对内网穿透的理解
  13. 最新CTR预测服务的GPU优化实践
  14. 区块链核心概念(1)
  15. python2代码转换python3(2018新)
  16. 【C# Opencv机器视觉】 Opencv水位检测、液体高度检测、卡尺高度检测
  17. 测码奔腾-Alpha冲刺总结
  18. spm12安装与使用
  19. Learning Disentangled Label Representations for Multi-label Classification
  20. 开发板ARM加FPGA架构运动控制卡 运动控制器 架构源码 原理图 资料包含此运动控制卡原理图,PCB图

热门文章

  1. 基于OpenCV高斯模型的公共场景人流量统计
  2. yum安装mysql驱动_centos7下使用yum安装mysql
  3. java不需要导的包
  4. 075_JSON.parse()
  5. java string 后几位_java中String占几个位元组
  6. 数据链路层协议_数据链路层 基本数据链路协议
  7. Android Volley完全解析1:初识Volley的基本用法
  8. Android中Canvas绘图之Shader使用图文详解
  9. 总线上加三个终端电阻可以吗_什么是RS485总线?怎么使用RS485总线?
  10. python安装linux软件_Linux之安装常用软件