工厂模式主要包括工厂方法抽象工厂,它的主要目标是把实例化这一活动从类中脱离出来,降低系统的耦合度,具体做法就是封装对象的创建。

工厂方法

工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

直接通过实例来说明这一模式。我们模拟了一个披萨店,它需要实现Pizza类和PizzaStore类,PizzaStore类需要包含orderPizza方法。在orderPizza方法中需要对菜单中的某几种披萨进行实例化。如果直接使用new进行实例化,当我们想更新菜单时,就必须对orderPizza中的代码进行更改,很明显违背了我们“对修改封闭”的原则。 为此我们声明一个工厂方法,原本是由一个对象负责所有具体类的实例化,现在通过对PizzaStore做一些小转变,变成由一群子类来负责实例化,从而达到将对象创建的过程封装的目的。

public abstract class PizzaStore {abstract Pizza createPizza(String item);public Pizza orderPizza(String type) {Pizza pizza = createPizza(type);System.out.println("--- Making a " + pizza.getName() + " ---");pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;}
}

项目用Maven构建,测试方法位于test目录下。 工厂方法的类图为

抽象工厂

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

承接工厂方法的例子,如果为了确保每家披萨加盟店都使用高质量的原料,我们需要建造一个生产原料的工厂,并将原料运送到各家加盟店。为这个创建原料的工厂定义的接口就是抽象工厂:

public interface PizzaIngredientFactory {public Dough createDough();public Sauce createSauce();public Cheese createCheese();public Veggies[] createVeggies();public Pepperoni createPepperoni();public Clams createClam();}

不同区域的原料工厂均实现改接口,且可以根据当地的特色口味进行个性化。这样一来,原料工厂就从具体的原料中被解耦。

抽象工厂的类图如下:

工厂模式中体现了模式设计的另一项原则:依赖倒置原则,即要依赖抽象,不要依赖具体类。这个原则说明了:不能让高层组件依赖低层组件,而且不管高层或低层组件,两者都应该依赖于抽象。

工厂方法和抽象工厂的比较

  • 他们都用来封装对象的创建,通过减少应用程序和具体类之间的依赖促进松耦合。
  • 工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象。
  • 抽象工厂使用对象组合:对象的创建被是现在工厂接口所暴露出来的方法中。
  • 工厂方法允许类将实例化延迟到子类进行。
  • 抽象工厂创建相关的对象家族,而不需要依赖它们的具体类。

设计模式(4)——工厂模式相关推荐

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

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

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

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

  3. 三角形圆形创建与擦除java_设计模式---------------简单工厂模式

    设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...

  4. 策略模式和工厂模式的区别_设计模式之工厂模式-工厂方法模式

    设计模式之工厂模式-工厂方法模式 大家好,欢迎来到污污弹公司,今天司小司又接到了一个新活-披萨项目. 来源:凯哥Java(kaigejava) 需求: 披萨项目: 要方便披萨品种的扩展.要便于维护.要 ...

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

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

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

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

  7. php工厂模式和单例模式,php 设计模式之工厂模式、单例模式、注册树模式

    php 设计模式之工厂模式.单例模式.注册树模式 在软件工程中,创建型设计模式承担着对象创建的职责,尝试创建适合程序上下文的对象,对象创建设计模式的产生是由于软件工程设计的问题,具体说是向设计中增加复 ...

  8. 教你如何一篇博客读懂设计模式之—--工厂模式

    一篇博客读懂设计模式之-工厂模式 工厂模式在我们日常开发的时候经常用到,相信大家都有了一定的了解,工厂模式是一种创建对象的设计模式,它提供一种创建对象的最佳方式. 主要过程是: 定义一个创建对象的接口 ...

  9. 一篇博客读懂设计模式之---工厂模式

    设计模式之-工厂模式 工厂模式: 创建过程: 创建Shape接口 public interface Shape {void draw(); } 创建实现类: public class Circle i ...

  10. java 工厂模式详解_Java设计模式之工厂模式详解

    简单工厂其实并不是设计模式,只是一种编程习惯. 首先我们创建父类Cup,所有杯子类的父类.再创建它的子类BigCup和SmallCup类. public abstract class Cup { pu ...

最新文章

  1. 关于“航天•轻舟机器人国赛技术交流会”邀请函
  2. linux系统制作macos启动,MacOS下制作启动盘
  3. 结果显示窗口如何缩小_【操作教程】零基础如何学习PS与Sai?
  4. JavaScriptBreak 语句 continue 语句
  5. oracle11 删除表空间,oracle11g启动停止服务,修改字符集,导入导出,创建删除表空间,卸载oracle等...
  6. 【从入门到放弃-Java】并发编程-线程安全
  7. java exec 关闭,Java学习之使用Runtime.exec()启动、关闭Tomcat
  8. android inject so,android hook 框架 libinject 如何实现so注入
  9. Ae:Roto 笔刷和调整边缘
  10. USB redirection
  11. vue两列数据 合并成一列
  12. Java 拾遗补阙 ----- 运算符
  13. win10蓝屏后的解决办法
  14. 计算机表格大小怎么调整,excel怎么调整表格大小
  15. 时间戳服务器作用,时间戳服务器
  16. LTE中物理资源块的进一步认识
  17. 蚂蚁课堂视频笔记思维导图-3期 一、并发编程专题
  18. perl 常用模块使用例子
  19. class在c语言中,C语言中的class的应用
  20. CVPR 2020 论文大盘点-医学影像处理识别篇

热门文章

  1. 1.3 Zend_Acl (3)
  2. ubuntu安装之后需要做什么
  3. NOIP2017 Day1 T3 逛公园
  4. Selenium-WebDriver驱动对照表
  5. jmeter元件的作用域与执行顺序
  6. POJ 1458 Common Subsequence
  7. php.ini修改php上传文件大小限制的方法
  8. STL中间set具体用法!!!!
  9. URAL-1998 The old Padawan 二分
  10. SVN—如何安装SVN服务器端软件