前言

工厂模式是一种比较常见的创建模式。有时,可能你使用了工厂模式而你却还不知道你已经使用了它。至少我感觉下面说的第一种简单工厂模式,你是已经很熟悉了。并且是经常使用的。不信,就继续向下看。

简单工厂模式(Simple Factory Pattern)

从简单的工厂模式开始说起的话,我们要知道工厂模式的目的是什么?工厂模式的目的在于程序的可扩展性。而对于简单工厂模式来说,它是为了让程序有一个更好地封装,降低程序模块之间的耦合程度。

对于简单的工厂模式,其实也可以将其理解成为一个创建对象的工具类。工具类的形式,可以仿造如下代码编写:

[java] view plain copy
  1. public class SimpleFactory {
  2. public Object create(Class<?> clazz) {
  3. if (clazz.getName().equals(Plane.class.getName())) {
  4. return createPlane();
  5. } else if (clazz.getName().equals(Broom.class.getName())) {
  6. return createBroom();
  7. }
  8. return null;
  9. }
  10. private Broom createBroom() {
  11. return new Broom();
  12. }
  13. private Plane createPlane() {
  14. return new Plane();
  15. }
  16. }

测试代码如下:

[java] view plain copy
  1. public class FactoryTest {
  2. public static void main(String[] args) {
  3. // 简单工厂模式测试
  4. SimpleFactory simpleFactory = new SimpleFactory();
  5. Broom broom = (Broom) simpleFactory.create(Broom.class);
  6. broom.run();
  7. }
  8. }

正如之前所说的,简单的工厂模式,就是去创建一个创建对象的工具类。在这个工具类里面,我们就可以进行一些其他操作,比如对象的初始化。这样就避免了把对象初始化的大量代码(如果有大量代码的话)放在构造函数里了。

工厂方法模式(Factory Method Pattern)

之前说了简单的工厂模式,在简单的工厂模式里,我们创建了一个类似工具的类来创建相应的具体类对象。正因为其太过简单,有一点不成规范。所以,这里要对其做一些适当地封装。

我们来看一下工厂方法模式的定义吧。工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化哪一个。工厂方法让类把实例化推迟到了子类。(定义摘自《Head First设计模式》)

图-1 工厂方法模式

抽象工厂:

我们的抽象工厂可以是类似这样的:

[java] view plain copy
  1. public abstract class VehicleFactory {
  2. public abstract Moveable create();
  3. }

具体工厂:

代码就是这样简单而美好。而它有一个具体的实现工厂类:

[java] view plain copy
  1. public class BroomFactory extends VehicleFactory {
  2. @Override
  3. public Moveable create() {
  4. return new Broom();
  5. }
  6. }

这个具体的实现工厂告诉我们,这里可以通过 create() 方法来创建一个 Broom 对象。

我们可以这样来理解他们的关系:有一个大的工厂它就是 VehicleFactory,VehicleFactory工厂里又有很多生产车间,其中有一个就是 BroomFactory。我们的具体产品都是通过这些生产车间来负责生产的。

抽象产品接口:

说到了产品,我们可以先试想一下这些具体的产品都会有什么样的性质。我们可以这样来定义它们:

[java] view plain copy
  1. public interface Moveable {
  2. public void run();
  3. }

具体产品:

嗯,这是一些可以run(移动)的产品。就 BroomFactory 生产车间而言,它负责生产 Broom。这个 Broom 是具有 Moveable 的属性。那么它的实现可以这样来写:

[java] view plain copy
  1. public class Broom implements Moveable {
  2. @Override
  3. public void run() {
  4. System.out.println("我是Broom.我在飞...");
  5. }
  6. }

功能测试:

我们有工厂,并且知道了工厂要生产的产品了。那么我们就来生产一个 Broom 来试试吧:

[java] view plain copy
  1. VehicleFactory factory = new BroomFactory();
  2. Moveable moveable = factory.create();
  3. moveable.run();

这样我就生产了一个 Broom 了。是不是 so easy?

抽象工厂模式(Abstract Factory Pattern)

从上面的工厂方法中的结构图中,我们可以看到其中的具体工厂A和B是两个完全独立的。两者除了都是抽象工厂的子类,没有任何其他的交集。

但是,如果我们有这样一个需求:具体工厂A和B需要生产一些同类型的不同产品。那么我们就可以试试抽象工厂模式。

我们来看看抽象工厂模式是怎么定义的:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。同样在下面的结构图中,我们可以更好地解释这一定义。我们的抽象工厂中包含一系列的去构造一个抽象产品的方法,而具体产品的实现则是放在了具体工厂(图中的A和B)中进行。

图-2 抽象工厂模式

现在我们看看代码中是如何实现的。

抽象工厂:

[java] view plain copy
  1. public abstract class AbstractFactory {
  2. public abstract Flyable createFlyable();
  3. public abstract Moveable createMoveable();
  4. public abstract Writeable createWriteable();
  5. }

具体工厂:

从抽象工厂的代码中也可以看出,抽象工厂只是去“生产”一些抽象的东西。有点类似于底层机制的感觉。现在我们来看看具体工厂的实现。

[java] view plain copy
  1. public class Factory1 extends AbstractFactory {
  2. @Override
  3. public Flyable createFlyable() {
  4. return new Aircraft();
  5. }
  6. @Override
  7. public Moveable createMoveable() {
  8. return new Car();
  9. }
  10. @Override
  11. public Writeable createWriteable() {
  12. return new Pen();
  13. }
  14. }

抽象产品接口:

在具体工厂里,我们就可以生产一些具体的产品了。就是这里的Aircraft、Car、Pen。抽象的产品接口如下。

[java] view plain copy
  1. public interface Flyable {
  2. public void fly(int height);
  3. }

具体产品:

具体的产品则是要去实现这个接口,并实现其中的方法,如下:

[java] view plain copy
  1. public class Aircraft implements Flyable {
  2. @Override
  3. public void fly(int height) {
  4. System.out.println("我是一架客运机,我目前的飞行高度为:" + height + "千米。");
  5. }
  6. }

功能测试:

有了这些东西,那么我们就来好好生产一些产品吧。

[java] view plain copy
  1. public class FactoryTest {
  2. public static void main(String[] args) {
  3. AbstractFactory factory = new Factory1();
  4. Flyable flyable = factory.createFlyable();
  5. flyable.fly(1589);
  6. Moveable moveable = factory.createMoveable();
  7. moveable.run(87.6);
  8. Writeable writeable = factory.createWriteable();
  9. writeable.write("Hello World.");
  10. }
  11. }

现在让我们来看一下,结果是否跟我们想的一样吧。

图-3 抽象工厂模式运行结果图

总结

以上就是工厂模式的基本实现和详细说明。包括了简单工厂模式、工厂方法模式、抽象工厂模式。我们可以基于需求来选择合适的工厂模式。下面给出本文的所有代码的GitHub链接。

【设计模式】之工厂模式相关推荐

  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. MoviePy - 中文文档2-快速上手-MoviePy-预览
  2. es6常用语法和特性
  3. 16位灰度数据成像_16位 250M双通道PCI数据采集卡 FCFR-PCI9808
  4. [剑指offer]面试题26:复杂链表的复制
  5. Bringing up interface eth0: Device eth0 does not seem to be presen
  6. 第七天Python学习记录
  7. OSCache操作详解+标签使用
  8. 杭电ACM2003题
  9. 地心、南极、太平洋……那些年亚特兰蒂斯“去”过的地方
  10. excel去掉公式()
  11. Python办公自动化之文件读写操作与Excel,csv,PDF文件
  12. CSS基础(六)——还原设计稿
  13. TB-02 Kit开发板及TB系列BLE蓝牙模块固件及天猫精灵三元组串口烧录工具操作方法说明及固件市场介绍(基于泰凌微TLSR8258芯片)
  14. 大数据在医疗领域的应用
  15. Oralce数据库备份与恢复
  16. Python量化:计算KDJ指标
  17. Unity 打包程序后PC或Android真机调试Debug日志及调出的Profiler面板
  18. 计算机屏幕三种,多屏互动的三种表现类型
  19. Dell戴尔无法装Win7?完美解决此问题
  20. 数字电路----加法器的实现

热门文章

  1. 美不可言的CSS 三
  2. java日志框架之JCL和SLF4J
  3. matlab画立体仓库库位图_仓库货物库位图在Excel电子表格中的设计与实现
  4. HTML入门笔记(附完整代码)
  5. 麦当劳中国开心乐园餐重磅升级:由三件套升级为四件套
  6. java阿里云直播推流拉流工具类
  7. LeakCanary的原理初探
  8. 黄金斗士原生android,28日京东开售 联想黄金斗士S8正式发布
  9. matlab实现三自由度机械臂旋转
  10. verilog将100mhz分频为1hz_50m 分频器设计——50MHZ(含verilog程序)