每天一种设计模式之抽象工厂模式(Java实现)

概述

在了解抽象工厂模式之前我们应当先了解下工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象

工厂模式和抽象工厂模式的区别

两者没有太大的区别,唯一的区别就是抽象工厂在工厂模式的基础上又抽象出一个超级工厂(用于生产工厂),生产出来的工厂的工作模式和工厂模式一模一样

示例

还是以麦当劳为例,我们准备给麦当劳开两座工厂:

  • 养鸡厂
  • 餐具厂

养鸡场能生产:

  • 白羽鸡
  • 黑羽鸡
  • 黄羽鸡

餐具厂能生产:

  • 杯子
  • 餐盒

我们通过一个超级工厂来生产我们的工厂,然后通过工厂来生产我们对应的原材料

源码实现

首先我们定义一个食物接口Food

public interface Food{void printName();
}

三种鸡分别实现该接口

实现白羽鸡WhiteChicken

public class WhiteChicken implements Food{@overrideprintName(){System.out.println("白羽鸡");}
}

实现黑羽鸡BlackChicken

public class BlackChicken implements Food{@overrideprintName(){System.out.println("黑羽鸡");}
}

实现黄羽鸡YellowChicken

public class YellowChicken implements Food{@overrideprintName(){System.out.println("黄羽鸡");}
}

定义一个食物工厂FoodFactory用于生产各种鸡

public class FoodFactory {public Food getFood(String foodType){       if(foodType.equalsIgnoreCase("白羽鸡")){return new WhiteChicken();} else if(foodType.equalsIgnoreCase("黑羽鸡")){return new BlackChicken();} else if(foodType.equalsIgnoreCase("黄羽鸡")){return new YellowChicken();}// 没有匹配值返回空return null;}
}

然后定义一个包装接口Wrapper

public interface Wrapper{void printName();
}

实现杯子Cup

public class Cup implements Wrapper{@overrideprintName(){System.out.println("杯子");}
}

实现餐盒Box

public class Box implements Wrapper{@overrideprintName(){System.out.println("餐盒");}
}

定义一个包装工厂WrapperFactory用于生产各种包装

// 生产包装的工厂
public class WrapperFactory {public Wrapper getWrapper(String wrapperType){if(wrapperType.equalsIgnoreCase("杯子")){return new Cup();} else if(wrapperType.equalsIgnoreCase("餐盒")){return new Box();}// 没有匹配值返回空return null;}
}

直到这里工厂模式和抽象工厂模式都没有任何区别

接下来定义一个抽象工厂类,包含了两种工厂的生产方法


// 抽象工厂,包含了工厂里的两个类的方法
public abstract class AbstractFactory {public abstract Food getFood(String food);public abstract Wrapper getWrapper(String wrapper) ;
}

改造两个工厂分别继承这个抽象类,实现自己对应的方法

// 生产各种鸡的工厂
public class FoodFactory extends AbstractFactory{@Overridepublic Food getFood(String foodType){if(foodType.equalsIgnoreCase("白羽鸡")){return new WhiteChicken();} else if(foodType.equalsIgnoreCase("黑羽鸡")){return new BlackChicken();} else if(foodType.equalsIgnoreCase("黄羽鸡")){return new YellowChicken();}// 没有匹配值返回空return null;}@Overridepublic Wrapper getWrapper(String wrapper) {return null;}
}
// 生产包装的工厂
public class WrapperFactory extends AbstractFactory{@Overridepublic Food getFood(String food) {return null;}@Overridepublic Wrapper getWrapper(String wrapperType){if(wrapperType.equalsIgnoreCase("杯子")){return new Cup();} else if(wrapperType.equalsIgnoreCase("餐盒")){return new Box();}// 没有匹配值返回空return null;}
}

创建专门用于生产产品的工厂FactoryProducer

// 生产工厂类,根据参数创建工厂,即创建工厂的工厂
public class FactoryProducer {public static AbstractFactory getFactory(String factoryType){if(factoryType.equalsIgnoreCase("Food")){return new FoodFactory();} else if(factoryType.equalsIgnoreCase("Wrapper")){return new WrapperFactory();}return null;}
}

创建Demo类验证我们的实验

// 测试抽象工厂模式
public class Demo {public static void main(String[] args) {// 获取食物工厂AbstractFactory foodFactory = FactoryProducer.getFactory("food");// 获取包装工厂AbstractFactory wrapperFactory = FactoryProducer.getFactory("wrapper");//用工厂生产餐盒+白羽鸡Wrapper box = wrapperFactory.getWrapper("餐盒");Food whiteChicken = foodFactory.getFood("白羽鸡");//打印测试System.out.println("生产了一个包装:");box.printName();System.out.println("生产了一个食物:");whiteChicken.printName();}
}

得到如下输出:

生产了一个包装:
餐盒
生产了一个食物:
白羽鸡

以上就是抽象工厂模式的所有内容!

我创建了一个开源项目涵盖了33种设计模式的源码,GitHub地址如下
项目地址

每天一种设计模式之抽象工厂模式(Java实现)相关推荐

  1. java 工厂模式的写法_Java23种设计模式之抽象工厂模式

    概述 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...

  2. 23种设计模式之抽象工厂模式(Abstract Factory Pattern)

    前言:大家好,我是小威,24届毕业生,在一家满意的公司实习.本篇文章将23种设计模式中的抽象工厂模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识. 如果文章有什么需要改进的地方还请 ...

  3. 设计模式系列·抽象工厂模式

    前言 以小说的笔法写的设计模式系列文章,你绝对看得懂![首发于公众号:"聊聊代码"] 设计模式系列·王小二需求历险记(一) 设计模式系列·王小二需求历险记(二) 设计模式系列·封装 ...

  4. 设计模式三—抽象工厂模式

    设计模式三-抽象工厂模式 一.定义 抽象工厂模式是工厂方法模式的进一步抽象.如果产品簇中只有一种产品,则退化为工厂方法模式. 二.原理图 三.代码实例 * 苹果和土豆是园丁1的杰作 * 葡萄和西红柿是 ...

  5. 设计模式复习-抽象工厂模式

    设计模式复习-抽象工厂模式 有两种硬件,PC和Phone,有两种系统,Windows和Linux,现在假设PC和Phone上全都能安装这两个系统,并且将来硬件不会在变化,但是系统可能需要扩展,比如扩展 ...

  6. 设计模式——4.抽象工厂模式

    1. 模式动机 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一 ...

  7. 设计模式 C++抽象工厂模式

    推荐阅读设计模式 C++工厂方法模式 品牌知名度逐渐提高,不单单只生产一种产品,如果我们继续使用一个工厂对应一种产品,那么假如有三个品牌华为.小米.苹果.他们各自都要三种产品,分别为手机.耳机.笔记本 ...

  8. 设计模式-04抽象工厂模式

    设计模式-04抽象工厂模式 文章中涉及到的代码,请自行下载 https://gitee.com/pan_xiao_lei123/designmode.git 前面介绍的工厂方法模式中考虑的是一类产品的 ...

  9. 【设计模式】抽象工厂模式

    设计模式 抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽 ...

  10. 设计模式之抽象工厂模式---abstract factory

    模式的介绍 模式的定义 Provide an interface for creating families of related or dependent objects without speci ...

最新文章

  1. MaxCompute助力北斗大数据,千寻位置3秒实现厘米级定位
  2. 递归式的时间复杂度的计算
  3. mysql 差异还原_MySQL差异转储? 还原的其他策略?
  4. python 字符串、列表和元祖之间的切换
  5. VTK:Rendering之ColoredSphere
  6. php7安装mysqli扩展_Ubuntu14版本下无法使用php7.2版本的bcmath扩展
  7. python 根据文件夹大小删除修改时间比较早的文件
  8. Vue2.0史上最全入坑教程(上)—— 搭建Vue脚手架(vue-cli)
  9. 数据结构的堆栈与内存中堆栈的区别
  10. 配置NTP网络时间服务
  11. 和整数相乘_人教版五年级上册第1单元《小数乘整数》课件及同步练习
  12. 每天一道剑指offer-重建二叉树
  13. 人工智能笔记11 --强化学习
  14. SSD:单点多边界框探测器
  15. 计算机主板电杆,电脑主板cpu供电上下管怎样区分替换
  16. 68个经典励志小故事|哲理小故事,让你终身受益(1)
  17. 【云原生 | 12】Dockerfile语法详解及举例
  18. 厦门理工学院OJ题解(1223:Rite与跳舞毯)
  19. 五子棋 手打稍加改变自慕课网hyman
  20. 计算机逻辑函数,计算机智能化简多变量逻辑函数的算法分析

热门文章

  1. Openwrt平台搭建
  2. 数据库工程师的几个发展方向
  3. 差示光谱法的测定原理_完整版||绝对21张图谱解析21种仪器原理及应用
  4. linux 查看硬盘序列号、设备序列号、系统安装时间
  5. ie ajax十分卡,解决jquery .ajax 在IE下卡死问题的解决方法
  6. 运维工程师项目案例_要建设AIOps,运维工程师的角色和职责需如何调整?
  7. java实现消息推送_java实现后台服务器消息推送
  8. 消防报警图形显示装置linux,消防中控-消防控制室图形显示装置状态识别及操作...
  9. 开关电源初级和次级变压器之间的Y电容作用
  10. emWin BATTON控件透明化